SQL'de Tablonun Şema Adını Değiştirme


175

EmployeesVeritabanındaki tablonun şema adını değiştirmek istiyorum . Geçerli tablo Employeesveritabanı şema adı dboolarak değiştirmek istiyorumexe . Nasıl yapabilirim ?

Misal:

DAN

dbo.Employees

TO

exe.Employees

Bu sorgu ile denedim:

ALTER SCHEMA exe TRANSFER dbo.Employees

Ama bu bana bir hata veriyor:

'Exe' şeması değiştirilemiyor çünkü mevcut değil veya izniniz yok.

Ne kaçırdım?



1
Şema exe var mı?
James Culshaw

Hayır ben yaratmadım. Oluşturmak için ne yapmalıyım?
Şampiyon


Bu makaleyi gördüm ama biraz kafa karıştırıcı. Durumumda şemayı nasıl oluşturacağımı gösterebilir misin?
Şampiyon

Yanıtlar:


272

Şema Oluştur:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

ALTER Şeması:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Sys.scemas ve EXEC (...) işlevinin ne olduğunu açıklayabilir misiniz?
Şampiyon

10
sys.schemasveritabanı için tüm şemaları içeren bir tablodur. Exec ('...') sadece dinamik bir SQL çağrısı çalıştırır, bu durumda gereklidir çünkü bir CREATE SCHEMA komutu bir sorgu kümesindeki ilk ifade olmalı ve dinamik SQL olarak yürütme size bunu sağlar.
Eric J. Price

İçin tüm Tablolar , kontrol bu ve bu tek deyiminde yapmak, umut bazı biri yardımcı olur.
shaijut

Değiştirme şemasını kullanmak son derece yavaş görünüyor. (Ben transfer için 3 dakika 300 satır ile küçük bir masa sonra durdu.) Bunun yerine, dbo.Employees gelen exe.Employees içine seçin * kullanılan
Fivelements

29

Aşağıdan deneyin

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableBazı özel kelimelerin / karakterlerin hataya neden olmadığından emin olmak için kullanmak zorunda kaldım .
Stoinov

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

ALTER SCHEMASQL'de sorguyu kullandığımda her zaman parantez kullanmak zorundayım , ya da bir hata iletisi alıyorum.


5

SSMS ile yeni bir şema oluşturdum:

  • Sunucumdaki Nesne Gezgini'nde Güvenlik klasörünü tıklarsanız,
  • sağ tıklamalı Şemalar
  • "Yeni Şema ..." seçildi
  • Yeni şemayı adlandırdı (senin durumunda exe)
  • Tamam'ı tıklayın

Şemayı değiştirmek için bu yayını buldum, ancak yeni şemaya değiştirmeye çalışırken aynı izin hatasını alıyordum. Benim SSMS listelenen birkaç veritabanı var, bu yüzden sadece veritabanını belirlemeye çalıştım ve çalıştı:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Kodunuz:

FROM
 dbo.Employees
TO
 exe.Employees

Bu sorgu ile denedim.

ALTER SCHEMA exe TRANSFER dbo.Employees

Sadece yazın create schema exeve çalıştırın


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


0

Sql içinde nesneleri yeniden adlandırmak çok dikkatli olun. Yaptığınız şeyden tamamen uzak değilseniz, bağımlılıkların başarısız olmasına neden olabilirsiniz. Çevreye uygun erişiminiz olması şartıyla, yeniden adlandırmak için bunun kolayca (çok fazla) çalıştığını söyledikten sonra:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Ne yazık ki bu bu senaryoda çalışmaz, sp_rename yalnızca bir nesnenin [name] değerini değiştirmek için çalışır. Şemayı onunla değiştiremezsiniz. Eğer denediyseniz exec sp_rename 'dbo.Employees', 'exe.Employees'[dbo] adını alırsınız. [Exe.Employees]
Eric J. Price

ALTER SCHEMA (Şema Adı) TRANSFER (şemaAdı) (ObjectName);
djangojazz

Ayrıca, kullanım tablo o herhangi Görüntüleme bir tablo şemasını değiştirdiğinizde dikkat olmayacaktır güncellenmektedir. Bu görünümlerde metni (şema adları) manuel olarak güncellemeniz gerekir. (İç geçir ...)
Mike Gledhill

0

SSMS'de doğru veritabanı bağlamında olduğunuzdan emin olun. Sizinle aynı hatayı aldım, ancak şemanın zaten var olduğunu biliyordum. 'MASTER' bağlamında olduğumu fark etmedim. ALTER, veritabanımla içeriği değiştirdikten sonra çalıştı.


0

Durumda, daha düşük bir sürüm arayan -

SQL Server 2000 için:

sp_changeobjectowner @objname = 'dbo.Employess', @newowner = 'exe'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.