2013-03-18 28 views
102

Chcę zmienić nazwę schematu tabeli Employees w bazie danych. W obecnej tabeli Employees nazwa schematu bazy danych to dbo Chcę ją zmienić na exe. Jak mogę to zrobić ?Zmień nazwę schematu tabeli w SQL

Przykład:

OD

dbo.Employees 

DO

exe.Employees 

Próbowałem z tym zapytaniem:

ALTER SCHEMA exe TRANSFER dbo.Employees 

Ale to daje mi błąd:

Cannot alter the schema 'exe', because it does not exist or you do not have permission.

Czego mi brakowało?

+3

Czy [utworzyłeś schemat exe] (http://msdn.microsoft.com/en-us/library/ms189462.aspx)? – PinnyM

+1

Czy istnieje schemat exe? –

+0

Nie, nie stworzyłem. Co mam zrobić, aby go stworzyć? – theChampion

Odpowiedz

169

Tworzenie schematu:

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 
+2

Czy możesz wyjaśnić, czym jest funkcja sys.scemas i EXEC (...)? – theChampion

+8

'sys.schemas' jest tabelą zawierającą wszystkie schematy bazy danych. Exec ("...") po prostu uruchamia dynamiczne wywołanie SQL, w tym przypadku jest to konieczne, ponieważ polecenie CREATE SCHEMA musi być pierwszą instrukcją wsadową zapytania i wykonywać ją w sposób dynamiczny SQL. –

+0

Dobrze, dziękuję. – theChampion

0

Należy bardzo ostrożnie zmieniać nazwy obiektów w sql. Możesz spowodować, że zależności się nie powiodą, jeśli nie jesteś w pełni z tym, co robisz. Mimo, że to działa łatwo (zbyt wiele, więc) dla zmiany nazwy rzeczy, o ile masz dostęp właściwego na środowisko:

exec sp_rename 'Nameofobject', 'ReNameofobject' 
+1

Niestety to nie zadziała w tym scenariuszu, sp_rename działa tylko w celu zmiany wartości [name] obiektu. Nie można zmienić schematu za jego pomocą. Jeśli spróbowałeś 'exec sp_rename 'dbo.Employees', 'exe.Employees'', dostałeś nazwę [dbo]. [Exe.Employees] –

+0

ZMIANA SCHEMATU (Nazwa schematu) TRANSFER (nazwa schematu). (ObjectName); – djangojazz

+0

Należy również pamiętać, że po zmianie schematu tabeli wszelkie widoki korzystające z tej tabeli * nie zostaną * zaktualizowane. Będziesz musiał ręcznie zaktualizować tekst (nazwy schematów) w tych widokach. (Westchnienie ...) –

17

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 
+0

to powinno być przyjęte rozwiązanie – Adaptabi

+0

@DotNetWise hej dziękuje, ale tak czy inaczej, ponieważ użytkownik zaakceptował odpowiedź, więc nie możemy zmuszać do akceptacji mojego rozwiązania. Wielkie dzięki za ponowne rozpatrzenie mojej odpowiedzi jako lepszej – DevelopmentIsMyPassion

3

Twój kod:

FROM 
dbo.Employees 
TO 
exe.Employees 

Próbowałem z tym zapytaniem.

ALTER SCHEMA exe TRANSFER dbo.Employees 

Wystarczy napisać create schema exe i wykonać go

4

Through SSMS, stworzyłem nowy schemat poprzez:

  • Kliknięcie folder Security w Eksploratorze obiektów w moim serwerze,
  • kliknięciu prawym przyciskiem myszy Schematy
  • Wybrany "Nowy schemat ..."
  • Nazwany moim nowym s Chema (exe w danym przypadku)
  • Hit OK

znalazłem ten post do zmiany schematu, ale także uzyskiwanie błąd same uprawnienia, gdy próbuje przejść do nowego schematu. Mam kilka baz danych wymienionych w moich SSMS, więc po prostu starał określający bazę i to działało:

USE (yourservername) 
ALTER SCHEMA exe TRANSFER dbo.Employees 
8
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName] 

zawsze trzeba używać nawiasów, kiedy należy użyć zapytania ALTER SCHEMA w SQL, albo otrzymuję Komunikat o błędzie.

2
CREATE SCHEMA exe AUTHORIZATION [dbo] 
GO 

ALTER SCHEMA exe 
TRANSFER dbo.Employees 
GO 

Więcej szczegółów click here

+0

Dziękuję, to bardzo pomocne dla mnie. –

0

Upewnij się, że jesteś we właściwym kontekście bazy danych w SSMS. Mam taki sam błąd jak 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.