Zmień nazwę schematu tabeli w języku SQL

175

Chcę zmienić nazwę schematu tabeli Employeesw bazie danych. W bieżącej tabeli Employeesnazwa schematu bazy danych to dboChcę go zmienić na exe. Jak mogę to zrobić ?

Przykład:

Z

dbo.Employees

DO

exe.Employees

Próbowałem z tym zapytaniem:

ALTER SCHEMA exe TRANSFER dbo.Employees

Ale to daje mi błąd:

Nie można zmienić schematu „exe”, ponieważ nie istnieje lub nie masz uprawnień.

Co mnie ominęło?

mistrz
źródło
4
Czy utworzyłeś schemat exe ?
PinnyM
1
Czy istnieje schemat exe?
James Culshaw
Nie, nie stworzyłem. Co mam zrobić, aby go stworzyć?
mistrzem
run create schema: msdn.microsoft.com/en-US/library/ms189462%28v=sql.90%29.aspx
a_horse_with_no_name
Widziałem ten artykuł, ale jest trochę zagmatwany. Czy możesz mi pokazać, jak stworzyć schemat w mojej sytuacji?
mistrzem

Odpowiedzi:

272

Utwórz schemat:

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

ALTER Schemat:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees
Pandian
źródło
3
Czy możesz wyjaśnić, czym jest sys.scemas i funkcja EXEC (...)?
Champion
10
sys.schemasto tabela zawierająca wszystkie schematy bazy danych. Exec ('...') po prostu uruchamia dynamiczne wywołanie SQL, w tym przypadku jest to potrzebne, ponieważ polecenie CREATE SCHEMA musi być pierwszą instrukcją w partii zapytania i wykonywać je tak, jak zapewnia to dynamiczny SQL.
Eric J. Price
Dla wszystkich tabel , sprawdź to i to, aby zrobić to w jednym oświadczeniu, nadzieja komuś pomoże.
shaijut,
Używanie schematu alter wydaje się niezwykle powolne. (Zatrzymałem to po 3 minutach w celu przeniesienia małej tabeli z 300 wierszami.) Zamiast tego użyłem select * do exe. Pracownicy z dbo Pracownicy
fivelements
29

Spróbuj poniżej

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
DevelopmentIsMyPassion
źródło
Musiałem użyć, set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableaby upewnić się, że niektóre specjalne słowa / znaki nie powodują błędów.
Stoinov
21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

Zawsze muszę używać nawiasów, gdy używam ALTER SCHEMAzapytania w SQL lub otrzymuję komunikat o błędzie.

Lauren
źródło
5

Poprzez SSMS stworzyłem nowy schemat przez:

  • Klikając folder Security w Object Explorer na moim serwerze,
  • Schematy kliknięte prawym przyciskiem myszy
  • Wybrano „Nowy schemat ...”
  • Nazwany mój nowy schemat (exe w twoim przypadku)
  • Kliknij OK

Znalazłem ten post, aby zmienić schemat, ale otrzymywałem również ten sam błąd uprawnień podczas próby przejścia na nowy schemat. Mam kilka baz danych wymienionych w moim SSMS, więc właśnie spróbowałem określić bazę danych i zadziałało:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 
Jason D.
źródło
3

Twój kod to:

FROM
 dbo.Employees
TO
 exe.Employees

Próbowałem z tym zapytaniem.

ALTER SCHEMA exe TRANSFER dbo.Employees

Po prostu napisz create schema exei wykonaj

user2599599
źródło
3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO
Dilip Kr Singh
źródło
0

Bądź bardzo ostrożny podczas zmieniania nazw obiektów w sql. Możesz spowodować, że zależności zawodzą, jeśli nie jesteś całkowicie wolny od tego, co robisz. Powiedziawszy, że działa to łatwo (zbyt mocno) w przypadku zmiany nazw rzeczy, pod warunkiem, że masz odpowiedni dostęp do środowiska:

exec sp_rename 'Nameofobject', 'ReNameofobject'
djangojazz
źródło
1
Niestety to nie zadziała w tym scenariuszu, sp_rename działa tylko do zmiany wartości [nazwa] obiektu. Nie możesz za jego pomocą zmienić schematu. Gdybyś spróbował exec sp_rename 'dbo.Employees', 'exe.Employees', dostałbyś nazwę [dbo]. [Exe. Pracownicy]
Eric J. Price
ALTER SCHEMA (nazwa schematu) TRANSFER (schemaName). (ObjectName);
djangojazz
Należy również pamiętać, że po zmianie schematu tabeli wszystkie widoki korzystające z tej tabeli nie zostaną zaktualizowane. Musisz ręcznie zaktualizować tekst (nazwy schematów) w tych widokach. (Ech ...)
Mike Gledhill
0

Upewnij się, że jesteś we właściwym kontekście bazy danych w programie SSMS. Mam ten sam błąd co Ty, ale wiedziałem, że schemat już istnieje. Nie zdawałem sobie sprawy, że jestem w kontekście „MASTER”. ALTER działał po zmianie kontekstu na moją bazę danych.

billmack30
źródło
0

W przypadku, gdy ktoś szuka niższej wersji -

W przypadku programu SQL Server 2000:

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

iravinandan
źródło