Ä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?



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

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

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.


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 

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


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


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'

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.


0

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

Für SQL Server 2000:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.