Ändern Sie den Schemanamen der Tabelle in SQL

175

Ich möchte den Schemanamen der Tabelle Employeesin der Datenbank ändern . In der aktuellen Tabellendatenbank Employeeslautet der Schemaname, den dboich ändern möchte exe. Wie kann ich es tun ?

Beispiel:

VON

dbo.Employees

ZU

exe.Employees

Ich habe es mit dieser Abfrage versucht:

ALTER SCHEMA exe TRANSFER dbo.Employees

Aber das gibt mir einen Fehler:

Das Schema 'exe' kann nicht geändert werden, da es nicht vorhanden ist oder Sie keine Berechtigung haben.

Was habe ich verpasst?

der Meister
quelle
4
Haben Sie das exe-Schema erstellt ?
PinnyM
1
Existiert das Schema exe?
James Culshaw
Nein, ich habe nicht erstellt. Was soll ich tun, um es zu erstellen?
TheChampion
Führen Siecreate schema
Folgendes aus
Ich habe diesen Artikel gesehen, aber er ist wenig verwirrend. Können Sie mir zeigen, wie ich das Schema in meiner Situation erstelle?
TheChampion

Antworten:

270

Schema erstellen:

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

ALTER-Schema:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees
Pandian
quelle
3
Können Sie erklären, was sys.scemas und EXEC (...) sind?
TheChampion
10
sys.schemasist eine Tabelle, die alle Schemas für die Datenbank enthält. Der Exec ('...') führt nur einen dynamischen SQL-Aufruf aus. In diesem Fall ist dies erforderlich, da ein CREATE SCHEMA-Befehl die erste Anweisung in einem Abfragebatch sein muss und die Ausführung als dynamisches SQL dies ermöglicht.
Eric J. Price
Überprüfen Sie dies und das für alle Tabellen , um dies in einer einzigen Anweisung zu tun. Die Hoffnung hilft jemandem.
Shaijut
Die Verwendung des Alter-Schemas scheint extrem langsam zu sein. (Ich habe es nach 3 Minuten gestoppt, um eine kleine Tabelle mit 300 Zeilen zu übertragen.) Stattdessen habe ich select * in exe.Employees von dbo.Employees
fivelements verwendet
29

Versuchen Sie es unten

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
quelle
Ich musste set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tablesicherstellen, dass einige spezielle Wörter / Zeichen keinen Fehler verursachen.
Stoinov
21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

Ich muss immer die Klammern verwenden, wenn ich die ALTER SCHEMAAbfrage in SQL verwende, oder ich erhalte eine Fehlermeldung.

Lauren
quelle
5

Über SSMS habe ich ein neues Schema erstellt von:

  • Klicken Sie im Objekt-Explorer auf meinem Server auf den Ordner Sicherheit.
  • Rechtsklick Schemas
  • Ausgewähltes "Neues Schema ..."
  • Benannte mein neues Schema (exe in Ihrem Fall)
  • Klicken Sie auf OK

Ich habe festgestellt, dass dieser Beitrag das Schema ändert, aber beim Versuch, auf das neue Schema zu wechseln, wurde der gleiche Berechtigungsfehler angezeigt. Ich habe mehrere Datenbanken in meinem SSMS aufgelistet, also habe ich nur versucht, die Datenbank anzugeben, und es hat funktioniert:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 
Jason D.
quelle
3

Ihr Code lautet:

FROM
 dbo.Employees
TO
 exe.Employees

Ich habe es mit dieser Abfrage versucht.

ALTER SCHEMA exe TRANSFER dbo.Employees

Einfach schreiben create schema exeund ausführen

user2599599
quelle
3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO
Dilip Kr Singh
quelle
0

Seien Sie sehr, sehr vorsichtig, wenn Sie Objekte in SQL umbenennen. Sie können dazu führen, dass Abhängigkeiten fehlschlagen, wenn Sie nicht vollständig mit dem, was Sie tun, vertraut sind. Allerdings funktioniert dies leicht (zu sehr), um Dinge umzubenennen, vorausgesetzt, Sie haben Zugriff auf die Umgebung:

exec sp_rename 'Nameofobject', 'ReNameofobject'
Djangojazz
quelle
1
Leider funktioniert dies in diesem Szenario nicht. Sp_rename funktioniert nur zum Ändern des [name] -Werts eines Objekts. Sie können das Schema damit nicht ändern. Wenn Sie es versuchen exec sp_rename 'dbo.Employees', 'exe.Employees'würden, würden Sie den Namen [dbo] erhalten. [Exe.Employees]
Eric J. Price
ALTER SCHEMA (Name des Schemas) TRANSFER (Schemaname). (ObjectName);
Djangojazz
Beachten Sie außerdem, dass beim Ändern des Schemas einer Tabelle alle Ansichten, die diese Tabelle verwenden , nicht aktualisiert werden. Sie müssen den Text (die Schemanamen) in diesen Ansichten manuell aktualisieren. (Seufz ...)
Mike Gledhill
0

Stellen Sie sicher, dass Sie sich in SSMS im richtigen Datenbankkontext befinden. Ich habe den gleichen Fehler wie Sie erhalten, aber ich wusste, dass das Schema bereits vorhanden ist. Ich wusste nicht, dass ich mich im 'MASTER'-Kontext befinde. ALTER hat funktioniert, nachdem ich den Kontext in meine Datenbank geändert habe.

billmack30
quelle
0

Für den Fall, dass jemand nach einer niedrigeren Version sucht -

Für SQL Server 2000:

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

iravinandan
quelle