ALTER TABLE (Transact-SQL)
Aktualisiert: 15. September 2007
Ändert eine Tabellendefinition durch Ändern, Hinzufügen oder Löschen von Spalten und Einschränkungen, Neuzuweisen von Partitionen oder Deaktivieren bzw. Aktivieren von Einschränkungen und Triggern.
Transact-SQL-Syntaxkonventionen
Syntax
ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name [ ( { precision [ , scale ]
| max | xml_schema_collection } ) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
| {ADD | DROP } { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION}
}
| [ WITH { CHECK | NOCHECK } ] ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
} [ ,...n ]
| DROP
{
[ CONSTRAINT ] constraint_name
[ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
| COLUMN column_name
} [ ,...n ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
}
[ ; ]
<drop_clustered_constraint_option> ::=
{
MAXDOP = max_degree_of_parallelism
| ONLINE = {ON | OFF }
| MOVE TO { partition_scheme_name ( column_name ) | filegroup
| "default"}
}
Argumente
- database_name
Der Name der Datenbank, in der die Tabelle erstellt wurde.
- schema_name
Der Name des Schemas, zu dem die Tabelle gehört.
- table_name
Der Name der Tabelle, die geändert werden soll. Wenn die Tabelle nicht in der aktuellen Datenbank oder nicht in dem Schema enthalten ist, das dem aktuellen Benutzer gehört, müssen die Datenbank und das Schema explizit angegeben werden.
ALTER COLUMN
Gibt an, dass die genannte Spalte geändert werden soll. ALTER COLUMN ist nicht zulässig, wenn der Kompatibilitätsgrad kleiner oder gleich 65 ist. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL).Bei der geänderten Spalte darf es sich nicht um eine der folgenden handeln:
- Die Spalte darf nicht vom timestamp-Datentyp sein.
- Die Spalte darf nicht die ROWGUIDCOL-Spalte der Tabelle sein.
- Die Spalte darf keine berechnete Spalte sein und nicht in einer berechneten Spalte verwendet werden.
- Die Spalte darf nicht in einem Index verwendet werden, es sei denn, die Spalte ist vom Datentyp varchar, nvarchar oder varbinary, der Datentyp wird nicht geändert und die neue Größe ist größer oder gleich der alten Größe und der Index ist nicht Ergebnis einer PRIMARY KEY-Einschränkung.
- Die Spalte darf nicht in Statistiken verwendet werden, die von der CREATE STATISTICS-Anweisung generiert werden. Entfernen Sie die Statistiken zunächst mithilfe der DROP STATISTICS-Anweisung. Vom Abfrageoptimierer automatisch generierte Statistiken werden von ALTER COLUMN automatisch gelöscht.
- Die Spalte darf nicht in einer PRIMARY KEY- oder [FOREIGN KEY] REFERENCES-Einschränkung verwendet werden.
- Die Spalte darf nicht in einer CHECK- oder UNIQUE-Einschränkung verwendet werden. Das Ändern der Länge einer Spalte mit variabler Länge, die in einer CHECK- oder UNIQUE-Einschränkung verwendet wird, ist dagegen zulässig.
- Der Spalte darf keine Standarddefinition zugeordnet sein. Die Länge, die Genauigkeit oder die Dezimalstellen einer Spalte können jedoch geändert werden, sofern der Datentyp nicht geändert wird.
Der Datentyp der text-, ntext- und image-Spalten kann nur in der folgenden Weise geändert werden:- text in varchar(max), nvarchar(max) oder xml
- ntext in varchar(max), nvarchar(max) oder xml
- image in varbinary(max)
Änderungen des Datentyps können Datenänderungen zur Folge haben. Beispielsweise kann die Änderung einer Spalte vom Datentyp nchar oder nvarchar in char oder varchar zur Konvertierung erweiterter Zeichen führen. Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL). Das Reduzieren der Genauigkeit und der Dezimalstellen einer Spalte kann zum Abschneiden von Daten führen.
Der Datentyp einer Spalte einer partitionierten Tabelle kann nicht geändert werden.
- column_name
Der Name der Spalte, die geändert, hinzugefügt oder gelöscht werden soll. column_name kann maximal 128 Zeichen enthalten. Bei neuen Spalten kann column_name für mit einem timestamp-Datentyp erstellte Spalten entfallen. Der Name timestamp wird verwendet, wenn column_name für eine timestamp-Spalte nicht angegeben ist.
[ type_schema_name**.** ] type_name
Der neue Datentyp einer geänderten Spalte, oder der Datentyp einer hinzugefügten Spalte. In partitionierten Tabellen kann type_name nicht für vorhandene Spalten angegeben werden. type_name kann ein beliebiger der folgenden Werte sein:- Ein SQL Server 2005-Systemdatentyp.
- Ein Aliasdatentyp, der auf einem SQL Server-Systemdatentyp basiert. Aliasdatentypen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können.
- Ein benutzerdefinierter .NET Framework-Typ und das Schema, zu dem er gehört. Benutzerdefinierte .NET Framework-Typen werden mit der CREATE TYPE-Anweisung erstellt, bevor sie in einer Tabellendefinition verwendet werden können.
Es gelten folgende Kriterien für type_name in einer geänderten Spalte:
- Der ursprüngliche Datentyp muss implizit in den neuen Datentyp konvertiert werden können.
- type_name darf nicht timestamp sein.
- ANSI NULL Default ist für ALTER COLUMN immer aktiviert. Fehlt die Angabe, so lässt die Spalte NULL-Werte zu.
- ANSI-Leerstellen sind für ALTER COLUMN immer aktiviert.
- Wenn die geänderte Spalte eine Identitätsspalte ist, muss new_data_type ein Datentyp sein, der die IDENTITY-Eigenschaft unterstützt.
- Die aktuelle Einstellung für SET ARITHABORT wird ignoriert. ALTER TABLE wird ausgeführt, als sei ARITHABORT aktiviert.
Hinweis: Falls die COLLATE-Klausel nicht angegeben wird, bewirkt das Ändern des Datentyps einer Spalte die Änderung der Sortierung in die Standardsortierung der Datenbank.
- precision
Die Genauigkeit für den angegebenen Datentyp. Weitere Informationen zu gültigen Genauigkeitswerten finden Sie unter Genauigkeit, Dezimalstellen und Länge (Transact-SQL).
- scale
Die Dezimalstellen für den angegebenen Datentyp. Weitere Informationen zu gültigen Dezimalstellenwerten finden Sie unter Genauigkeit, Dezimalstellen und Länge (Transact-SQL).
- max
Gilt nur für die Datentypen varchar, nvarchar und varbinary zum Speichern von 2^31-1 Bytes an Zeichen, Binärdaten und Unicode-Daten.
- xml_schema_collection
Gilt nur für den xml-Datentyp zum Zuordnen eines XML-Schemas zu dem Typ. Bevor Sie eine xml-Spalte mit einer Schemaauflistung typisieren können, muss die Schemaauflistung mithilfe von CREATE XML SCHEMA COLLECTION in der Datenbank erstellt werden.
COLLATE < collation_name >
Gibt die neue Sortierung für die geänderte Spalte an. Wenn keine Sortierung angegeben ist, wird der Spalte die Standardsortierung der Datenbank zugewiesen. Als Name für die Sortierung kann entweder ein Windows-Sortierungsname oder ein SQL-Sortierungsname verwendet werden. Eine Liste und weitere Informationen finden Sie unter Name der Windows-Sortierreihenfolge (Transact-SQL) und SQL-Sortierungsname (Transact-SQL).Mit der COLLATE-Klausel können nur die Sortierungen für Spalten der Datentypen char, varchar, nchar und nvarchar geändert werden. Wenn Sie die Sortierung einer Spalte eines benutzerdefinierten Aliasdatentyps ändern möchten, müssen Sie zunächst mit separaten ALTER TABLE-Anweisungen die Spalte in einen SQL Server-Systemdatentyp ändern und ihre Sortierung ändern. Anschließend können Sie die Spalte zurück in einen Aliasdatentyp ändern.
Mit ALTER COLUMN kann die Sortierung nicht geändert werden, wenn eine der folgenden Bedingungen zutrifft:
- Wenn eine CHECK-Einschränkung, eine FOREIGN KEY-Einschränkung oder berechnete Spalten auf die geänderte Spalte verweisen.
- Wenn ein Index, eine Statistik oder ein Volltextindex mit der Spalte erstellt werden. Statistiken, die automatisch für die geänderte Spalte erstellt wurden, werden gelöscht, wenn die Spaltensortierung geändert wird.
- Wenn eine schemagebundene Sicht oder Funktion auf die Spalte verweist.
Weitere Informationen finden Sie unter COLLATE (Transact-SQL).
NULL | NOT NULL
Gibt an, ob die Spalte NULL-Werte akzeptiert. Spalten, die keine NULL-Werte zulassen, können mit ALTER TABLE nur hinzugefügt werden, wenn für sie ein Standardwert angegeben ist oder wenn die Tabelle leer ist. NOT NULL kann für berechnete Spalten nur dann angegeben werden, wenn PERSISTED ebenfalls angegeben wird. Wenn die neue Spalte NULL-Werte zulässt und kein Standardwert angegeben ist, enthält sie einen NULL-Wert für jede Zeile in der Tabelle. Wenn die neue Spalte NULL-Werte zulässt und eine Standarddefinition mit der neuen Spalte hinzugefügt wird, kann WITH VALUES verwendet werden, um den Standardwert in der neuen Spalte für jede vorhandene Zeile in der Tabelle zu speichern.Wenn die neue Spalte keine NULL-Werte zulässt und die Tabelle nicht leer ist, muss eine DEFAULT-Definition mit der neuen Spalte hinzugefügt werden. Die neue Spalte wird dann automatisch in jeder vorhandenen Zeile mit dem Standardwert geladen.
Durch die Angabe von NULL in ALTER COLUMN kann erzwungen werden, dass eine NOT NULL-Spalte, mit Ausnahme von Spalten in PRIMARY KEY-Einschränkungen, NULL-Werte zulässt. NOT NULL kann nur in ALTER COLUMN angegeben werden, wenn die Spalte keine NULL-Werte enthält. Die NULL-Werte müssen auf einen beliebigen Wert aktualisiert werden, damit ALTER COLUMN NOT NULL zulässig ist. Beispiel:
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL
Wenn Sie eine Tabelle mit der CREATE TABLE- oder ALTER TABLE-Anweisung erstellen bzw. ändern, beeinflussen die Datenbank- und Sitzungseinstellungen die NULL-Zulässigkeit des in einer Spaltendefinition verwendeten Datentyps und setzen sie möglicherweise außer Kraft. Es wird empfohlen, eine nicht berechnete Spalte immer explizit als NULL oder NOT NULL zu definieren oder, im Falle eines benutzerdefinierten Datentyps, zuzulassen, dass die Spalte die standardmäßige NULL-Zulässigkeit des Datentyps verwendet. Weitere Informationen finden Sie unter CREATE TABLE (Transact-SQL).
Hinweis: Wenn NULL oder NOT NULL mit ALTER COLUMN angegeben ist, muss auch new_data_type [(precision [, scale ])] angegeben werden. Wenn Datentyp, Genauigkeit und Dezimalstellen nicht geändert werden, geben Sie die aktuellen Spaltenwerte an.
[ {ADD | DROP} ROWGUIDCOL ]
Gibt an, dass die ROWGUIDCOL-Eigenschaft zur angegebenen Spalte hinzugefügt oder aus ihr gelöscht wird. ROWGUIDCOL zeigt an, dass die Spalte eine GUID-Spalte für eine Zeile darstellt. Pro Tabelle kann nur eine uniqueidentifier-Spalte zur ROWGUIDCOL-Spalte erklärt werden, und die ROWGUIDCOL-Eigenschaft kann nur einer uniqueidentifier-Spalte zugewiesen werden. ROWGUIDCOL kann keiner Spalte eines benutzerdefinierten Datentyps zugewiesen werden.ROWGUIDCOL erzwingt keine Eindeutigkeit der in der Spalte gespeicherten Werte und generiert nicht automatisch Werte für neue Zeilen, die in die Tabelle eingefügt werden. Um eindeutige Werte für jede Spalte zu generieren, verwenden Sie entweder die NEWID-Funktion in INSERT-Anweisungen, oder geben Sie die NEWID-Funktion als Standard für die Spalte an.
[ {ADD | DROP} PERSISTED ]
Gibt an, dass die PERSISTED-Eigenschaft der angegebenen Spalte hinzugefügt oder aus ihr gelöscht wird. Die Spalte muss eine berechnete Spalte sein, die durch einen deterministischen Ausdruck definiert ist. Für Spalten, die als PERSISTED angegeben werden, speichert SQL Server 2005-Datenbankmodul die berechneten Werte physikalisch in der Tabelle und aktualisiert die Werte, wenn andere Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden. Durch Kennzeichnen einer berechneten Spalte als PERSISTED können Sie Indizes für berechnete Spalten erstellen, die durch deterministische, aber nicht genaue Ausdrücke definiert sind. Weitere Informationen finden Sie unter Erstellen von Indizes für berechnete Spalten.Jede berechnete Spalte, die als Partitionierungsspalte einer partitionierten Tabelle verwendet wird, muss explizit als PERSISTED gekennzeichnet sein.
- NOT FOR REPLICATION
Gibt an, dass Werte in Identitätsspalten nicht inkrementiert werden, wenn Replikations-Agents Einfügevorgänge ausführen. Diese Klausel kann nur angegeben werden, wenn column_name eine Identitätsspalte ist. Weitere Informationen finden Sie unter Steuern von Einschränkungen, Identitäten und Triggern mithilfe von NOT FOR REPLICATION.
WITH CHECK | WITH NOCHECK
Gibt an, ob die Daten in der Tabelle in Bezug auf eine neu hinzugefügte oder reaktivierte FOREIGN KEY- oder CHECK-Einschränkung überprüft werden. Fehlt die Angabe, so wird WITH CHECK für neue Einschränkungen und WITH NOCHECK für reaktivierte Einschränkungen angenommen.Verwenden Sie WITH NOCHECK, wenn neue CHECK- oder FOREIGN KEY-Einschränkungen nicht in Bezug auf vorhandene Daten überprüft werden sollen. Diese Vorgehensweise wird nur in seltenen Fällen empfohlen. Die neue Einschränkung wird bei allen späteren Datenaktualisierungen ausgewertet. Einschränkungsverletzungen, die beim Hinzufügen der Einschränkung durch WITH NOCHECK unterdrückt werden, können zu Fehlern bei zukünftigen Aktualisierungen führen, wenn Zeilen mit Daten aktualisiert werden, die der Einschränkung nicht entsprechen.
Der Abfrageoptimierer berücksichtigt mit WITH NOCHECK definierte Einschränkungen nicht. Diese Einschränkungen werden ignoriert, bis sie mithilfe von ALTER TABLE table CHECK CONSTRAINT ALL reaktiviert werden.
- ADD
Gibt an, dass eine oder mehrere Spaltendefinitionen, Definitionen berechneter Spalten oder Tabelleneinschränkungen hinzugefügt werden.
DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
Gibt an, dass constraint_name oder column_name aus der Tabelle entfernt wird. Es können mehrere Spalten und Einschränkungen aufgeführt sein. DROP COLUMN ist nicht zulässig, wenn der Kompatibilitätsgrad kleiner oder gleich 65 ist. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL).Der benutzerdefinierte oder vom System bereitgestellte Name der Einschränkung kann durch Abfragen der Katalogsichten sys.check_constraint, sys.default_constraints, sys.key_constraints und sys.foreign_keys ermittelt werden.
Eine PRIMARY KEY-Einschränkung kann nicht gelöscht werden, wenn ein XML-Index für die Tabelle vorhanden ist.
Unter folgenden Umständen kann eine Spalte nicht gelöscht werden:
- Wenn sie in einem Index verwendet wird.
- Wenn sie in einer CHECK-, FOREIGN KEY-, UNIQUE- oder PRIMARY KEY-Einschränkung verwendet wird.
- Wenn ihr ein mit dem DEFAULT-Schlüsselwort definierter Standardwert zugeordnet ist oder sie an ein Standardobjekt gebunden ist.
- Wenn sie an eine Regel gebunden ist.
Hinweis: Durch Löschen einer Spalte wird nicht der Speicherplatz der Spalte freigegeben. Unter Umständen müssen Sie den Speicherplatz einer gelöschten Spalte freigeben, wenn das Limit der Zeilengröße einer Tabelle fast erreicht oder überschritten ist. Zum Freigeben des Speicherplatzes erstellen Sie einen gruppierten Index für die Tabelle oder erstellen einen vorhandenen gruppierten Index mithilfe von ALTER INDEX neu.
- WITH <drop_clustered_constraint_option>
Gibt an, dass mindestens eine Option zum Löschen einer gruppierten Einschränkung festgelegt wurde.
MAXDOP = max_degree_of_parallelism
Setzt die Konfigurationsoption max degree of parallelism nur für die Dauer des Vorgangs außer Kraft. Weitere Informationen finden Sie unter max degree of parallelism (Option).Verwenden Sie die MAXDOP-Option, um die Anzahl der Prozessoren zu beschränken, die für die Ausführung paralleler Pläne verwendet werden. Der Maximalwert sind 64 Prozessoren.
Für max_degree_of_parallelism sind die folgenden Werte möglich:
- 1
Unterdrückt die Generierung paralleler Pläne.
- >1
Beschränkt die maximale Anzahl von Prozessoren, die bei einem parallelen Indexvorgang verwendet werden, auf die angegebene Anzahl.
- 0 (Standard)
Verwendet die tatsächliche Anzahl von Prozessoren oder weniger, je nach der aktuellen Arbeitsauslastung des Systems.
Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgänge.
Hinweis: Parallele Indexvorgänge sind nur in SQL Server 2005 Enterprise Edition verfügbar. - 1
ONLINE = { ON | OFF }
Gibt an, ob zugrunde liegende Tabellen und zugeordnete Indizes während des Indexvorgangs für Abfragen und Datenänderungen verfügbar sind. Der Standardwert ist OFF.- ON
Während des Indexvorgangs werden keine Langzeitsperren für Tabellen aufrechterhalten. Während der Hauptphase des Indexvorgangs wird die Quelltabelle nur mit einer beabsichtigten gemeinsamen Sperre (IS) belegt. So können Abfragen oder Aktualisierungen der zugrunde liegenden Tabelle und Indizes fortgesetzt werden. Zu Beginn des Vorgangs wird das Quellobjekt für sehr kurze Zeit mit einer gemeinsamen Sperre (S) belegt. Am Ende des Vorgangs wird für kurze Zeit eine gemeinsame Sperre (S) für die Quelle eingerichtet, wenn ein nicht gruppierter Index erstellt wird. Eine Schemaänderungssperre (SCH-M) wird dagegen eingerichtet, wenn ein gruppierter Index online erstellt oder gelöscht wird und wenn ein gruppierter oder nicht gruppierter Index neu erstellt wird. ONLINE kann nicht auf ON festgelegt werden, wenn ein Index für eine lokale temporäre Tabelle erstellt wird.
- OFF
Für die Dauer des Indexvorgangs werden Tabellensperren angewendet. Ein Offlineindexvorgang, bei dem ein gruppierter Index erstellt, neu erstellt oder gelöscht wird bzw. ein nicht gruppierter Index neu erstellt oder gelöscht wird, richtet eine Schemaänderungssperre (Sch-M) für die Tabelle ein. Dies verhindert sämtliche Benutzerzugriffe auf die zugrunde liegende Tabelle für die Dauer des Vorgangs. Ein Offlineindexvorgang, bei dem ein nicht gruppierter Index erstellt wird, richtet eine gemeinsame Sperre (S) für die Tabelle ein. Dies verhindert Aktualisierungen der zugrunde liegenden Tabelle, lässt jedoch Lesevorgänge, wie z. B. SELECT-Anweisungen, zu.
Weitere Informationen finden Sie unter Funktionsweise von Onlineindexvorgängen. Weitere Informationen zu Sperren finden Sie unter Sperrmodi.
Hinweis: Onlineindexvorgänge stehen nur in SQL Server 2005 Enterprise Edition zur Verfügung. - ON
MOVE TO ( partition_scheme_name ( column_name [ 1**,** ... n] ) | filegroup | "default"}
Gibt einen Speicherort an, an den die Datenzeilen verschoben werden sollen, die sich aktuell auf der Blattebene des gruppierten Indexes befinden. Die Tabelle wird an den neuen Speicherort verschoben.Hinweis: In diesem Kontext stellt default kein Schlüsselwort dar. Es ist ein Bezeichner für die Standarddateigruppe und muss in Trennzeichen eingeschlossen sein, wie in MOVE TO "default" oder MOVE TO [default]. Wenn "default" angegeben wird, muss die QUOTED_IDENTIFIER-Option für die aktuelle Sitzung auf ON festgelegt sein. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).
- { CHECK | NOCHECK} CONSTRAINT
Gibt an, dass constraint_name aktiviert oder deaktiviert wird. Diese Option kann nur mit FOREIGN KEY- und CHECK-Einschränkungen verwendet werden. Wenn NOCHECK angegeben wird, wird die Einschränkung deaktiviert, und zukünftige Einfügungen oder Aktualisierungen der Spalte werden nicht bezüglich der Einschränkungsbedingungen überprüft. DEFAULT-, PRIMARY KEY- und UNIQUE-Einschränkungen können nicht deaktiviert werden.
- ALL
Gibt an, dass alle Einschränkungen entweder mit der Option NOCHECK deaktiviert oder mit der Option CHECK aktiviert werden.
- {ENABLE | DISABLE} TRIGGER
Gibt an, dass trigger_name aktiviert oder deaktiviert wird. Ein Trigger bleibt auch dann für die Tabelle definiert, wenn er deaktiviert ist. Wenn jedoch INSERT-, UPDATE- oder DELETE-Anweisungen an der Tabelle ausgeführt werden, werden die Aktionen im Trigger erst durchgeführt, wenn der Trigger reaktiviert wird.
- ALL
Gibt an, dass alle Trigger in der Tabelle aktiviert oder deaktiviert werden.
- trigger_name
Gibt den Namen des Triggers an, der deaktiviert oder aktiviert werden soll.
SWITCH [ PARTITION source_partition_number_expression ] TO target_table [ PARTITION target_ partition_number_expression ]
Verlagert einen Datenblock auf eine der folgenden Arten:- Weist alle Daten einer Tabelle neu als eine Partition einer bereits vorhandenen partitionierten Tabelle zu.
- Wechselt eine Partition von einer partitionierten Tabelle zu einer anderen.
- Weist alle Daten aus einer Partition einer partitionierten Tabelle neu einer bereits vorhandenen nicht partitionierten Tabelle zu.
Wenn table eine partitionierte Tabelle ist, muss source_partition_number_expression angegeben werden. Wenn target_table partitioniert ist, muss target_partition_number_expression angegeben werden. Wenn die Daten einer Tabelle als Partition einer vorhandenen partitionierten Tabelle neu zugewiesen werden oder eine Partition von einer partitionierten Tabelle zu einer anderen gewechselt wird, muss die Zielpartition vorhanden und leer sein.
Wenn die Daten einer Partition neu zugewiesen werden, sodass sie eine einzelne Tabelle bilden, muss die Zieltabelle bereits erstellt und leer sein. Die Quelltabelle oder -partition und die Zieltabelle oder -partition müssen sich in derselben Dateigruppe befinden. Die entsprechenden Indizes oder Indexpartitionen müssen sich ebenfalls in derselben Dateigruppe befinden. Darüber hinaus gelten weitere Einschränkungen für das Wechseln von Partitionen. Weitere Informationen finden Sie unter Effizientes Übertragen von Daten durch Partitionswechsel. table und target_table dürfen nicht miteinander übereinstimmen. target_table kann einen mehrteiligen Bezeichner darstellen.
source_partition_number_expression und target_partition_number_expression sind konstante Ausdrücke, die auf Variablen und Funktionen verweisen können. Diese enthalten benutzerdefinierte Typvariablen und benutzerdefinierte Funktionen. Sie können nicht auf Transact-SQL-Ausdrücke verweisen.
Hinweis: Sie können die SWITCH-Anweisung nicht für replizierte Tabellen verwenden.
Hinweise
Verwenden Sie INSERT, um neue Datenzeilen hinzuzufügen. Verwenden Sie DELETE oder TRUNCATE TABLE, um Datenzeilen zu entfernen. Verwenden Sie UPDATE, um die Werte in vorhandenen Zeilen zu ändern.
Wenn der Prozedurcache Ausführungspläne enthält, die auf die Tabelle verweisen, kennzeichnet ALTER TABLE diese für die erneute Kompilierung bei der nächsten Ausführung.
Ändern der Größe einer Spalte
Sie können die Länge, Genauigkeit oder die Dezimalstellen einer Spalte ändern, indem Sie eine neue Größe für den Spaltendatentyp in der ALTER COLUMN-Klausel angeben. Wenn in der Spalte Daten vorhanden sind, darf die neue Größe nicht kleiner als die maximale Länge der Daten sein. Außerdem darf die Spalte nicht in einem Index definiert sein, es sei denn, die Spalte ist vom Datentyp varchar, nvarchar oder varbinary, der Datentyp wurde nicht geändert und der Index ist nicht Ergebnis einer PRIMARY KEY-Einschränkung. Siehe Beispiel P.
Sperren und ALTER TABLE
Die in ALTER TABLE angegebenen Änderungen werden sofort implementiert. Wenn die Änderungen Änderungen der Zeilen in der Tabelle erfordern, aktualisiert ALTER TABLE die Zeilen. ALTER TABLE belegt die Tabelle mit einer Schemaänderungssperre (SCH-M), um sicherzustellen, dass andere Verbindungen während der Änderung noch nicht einmal auf die Metadaten der Tabelle verweisen können. Eine Ausnahme sind Onlineindexvorgänge, die nur am Ende eine sehr kurze Schemaänderungssperre erfordern. Bei einem ALTER TABLE…SWITCH-Vorgang werden sowohl die Quell- als auch die Zieltabelle mit der Sperre belegt. Die an der Tabelle vorgenommenen Änderungen werden protokolliert und sind vollständig wiederherstellbar. Die Durchführung von Änderungen, die sich auf sämtliche Zeilen einer sehr großen Tabelle auswirken, wie das Löschen einer Spalte oder das Hinzufügen einer NOT NULL-Spalte mit einem Standardwert, kann viel Zeit in Anspruch nehmen und viele Protokolldatensätze generieren. Diese ALTER TABLE-Anweisungen sollten ebenso vorsichtig ausgeführt werden wie jede INSERT-, UPDATE- oder DELETE-Anweisung, die sich auf viele Zeilen auswirkt.
Ausführung paralleler Pläne
In SQL Server 2005 Enterprise Edition wird die Anzahl der Prozessoren, die zur Ausführung einer einzelnen ALTER TABLE ADD CONSTRAINT-Anweisung (indexbasiert) oder einer ALTER TABLE DROP CONSTRAINT-Anweisung (gruppierter Index) verwendet werden, durch die Konfigurationsoption max degree of parallelism und durch die aktuelle Arbeitsauslastung bestimmt. Wenn Datenbankmodul erkennt, dass das System ausgelastet ist, wird der Grad an Parallelität für den Vorgang automatisch reduziert, bevor mit der Ausführung der Anweisung begonnen wird. Sie können die Anzahl der Prozessoren, die zur Ausführung der Anweisung verwendet werden, durch Angeben der MAXDOP-Option manuell konfigurieren.
Partitionierte Tabellen
Neben dem Ausführen von SWITCH-Vorgängen mit partitionierten Tabellen kann mit ALTER TABLE der Status der Spalten, Einschränkungen und Trigger einer partitionierten Tabelle genau wie bei nicht partitionierten Tabellen geändert werden. Die Partitionierung der Tabelle selbst kann jedoch mit der Anweisung nicht geändert werden. Zum Neupartitionieren einer partitionierten Tabelle verwenden Sie ALTER PARTITION SCHEME und ALTER PARTITION FUNCTION. Zudem können Sie den Datentyp einer Spalte einer partitionierten Tabelle nicht ändern.
Einschränkungen für Tabellen mit schemagebundenen Sichten
Die Einschränkungen, die für ALTER TABLE-Anweisungen für Tabellen mit schemagebundenen Sichten gelten, sind dieselben, die derzeit beim Ändern von Tabellen mit einem einfachen Index angewendet werden. Das Hinzufügen einer Spalte ist zulässig. Das Entfernen oder Ändern einer Spalte, die Bestandteil einer schemagebundenen Sicht ist, ist dagegen nicht zulässig. Wenn für die ALTER TABLE-Anweisung das Ändern einer in einer schemagebundenen Sicht verwendeten Spalte erforderlich ist, schlägt ALTER TABLE fehl, und Datenbankmodul löst eine Fehlermeldung aus. Weitere Informationen zu Schemabindung und indizierten Sichten finden Sie unter CREATE VIEW (Transact-SQL).
Das Hinzufügen oder Entfernen von Triggern für Basistabellen wird durch das Erstellen einer schemagebundenen Sicht, die auf die Tabellen verweist, nicht beeinflusst.
Indizes und ALTER TABLE
Als Teil einer Einschränkung erstellte Indizes werden gelöscht, wenn die Einschränkung gelöscht wird. Mit CREATE INDEX erstellte Indizes müssen mit DROP INDEX gelöscht werden. Die ALTER INDEX-Anweisung kann verwendet werden, um einen Index neu zu erstellen, der Teil einer Einschränkungsdefinition ist. Die Einschränkung muss nicht mit ALTER TABLE gelöscht und erneut hinzugefügt werden.
Alle auf einer Spalte basierenden Indizes und Einschränkungen müssen entfernt werden, bevor die Spalte entfernt werden kann.
Wenn eine Einschränkung, für die ein gruppierter Index erstellt wurde, gelöscht wird, werden die Datenzeilen, die auf der Blattebene des gruppierten Indexes gespeichert waren, in einer nicht gruppierten Tabelle gespeichert. In SQL Server 2005 können Sie in einer einzelnen Transaktion den gruppierten Index löschen und die sich ergebende Tabelle in eine andere Dateigruppe oder ein anderes Partitionsschema verschieben, indem Sie die MOVE TO-Option angeben. Für die MOVE TO-Option gelten folgende Einschränkungen:
- MOVE TO ist nicht gültig für indizierte Sichten oder nicht gruppierte Indizes.
- Das Partitionsschema oder die Dateigruppe muss bereits vorhanden sein.
- Wird MOVE TO nicht angegeben, wird die Tabelle in demselben Partitionsschema oder derselben Dateigruppe platziert, das bzw. die für den gruppierten Index definiert war.
Beim Löschen eines gruppierten Indexes können Sie die Option ONLINE = ON angeben, sodass die DROP INDEX-Transaktion Abfragen und Änderungen der zugrunde liegenden Daten und der zugeordneten nicht gruppierten Indizes nicht blockiert.
Für ONLINE = ON gelten folgende Einschränkungen:
- ONLINE = ON ist nicht gültig für gruppierte Indizes, die auch deaktiviert sind. Deaktivierte Indizes müssen mit ONLINE = OFF gelöscht werden.
- Es können nicht mehrere Indizes gleichzeitig gelöscht werden.
- ONLINE = ON ist nicht gültig für indizierte Sichten, nicht gruppierte Indizes oder Indizes für lokale temporäre Tabellen.
Zum Löschen eines gruppierten Indexes ist temporärer Speicherplatz im Umfang des vorhandenen gruppierten Indexes erforderlich. Dieser zusätzliche Speicherplatz wird nach Abschluss des Vorgangs freigegeben.
Hinweis: |
---|
Die unter <drop_clustered_constraint_option> aufgeführten Optionen gelten für gruppierte Indizes für Tabellen und können nicht auf gruppierte Indizes für Sichten oder nicht gruppierte Indizes angewendet werden. |
Replizieren von Schemaänderungen
Wenn Sie ALTER TABLE für eine veröffentlichte Tabelle auf einem SQL Server-Verleger ausführen, wird diese Änderung standardmäßig an alle SQL Server-Verleger weitergegeben. Für diese Funktionalität bestehen einige Einschränkungen, und sie kann deaktiviert werden. Weitere Informationen finden Sie unter Vornehmen von Schemaänderungen in Publikationsdatenbanken.
Berechtigungen
Erfordert die ALTER-Berechtigung für die Tabelle.
ALTER TABLE-Berechtigungen gelten für beide an einer ALTER TABLE SWITCH-Anweisung beteiligten Tabellen. Alle verschobenen Daten erben die Sicherheitseinstellungen der Zieltabelle.
Falls Spalten in der ALTER TABLE-Anweisung mit einem benutzerdefinierten CLR-Typ (Common Language Runtime) oder Aliasdatentyp definiert sind, ist die REFERENCES-Berechtigung für den Typ erforderlich.
Beispiele
A. Hinzufügen einer neuen Spalte
Das folgende Beispiel fügt eine Spalte hinzu, die NULL-Werte zulässt und für die keine Werte durch eine DEFAULT-Definition bereitgestellt werden. Jede Zeile in der neuen Spalte erhält einen NULL
-Wert.
CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO
EXEC sp_help doc_exa ;
GO
DROP TABLE dbo.doc_exa ;
GO
B. Löschen einer Spalte
Das folgende Beispiel ändert eine Tabelle durch Entfernen einer Spalte.
CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO
C. Ändern des Datentyps einer Spalte
Das folgende Beispiel ändert eine Spalte einer Tabelle von INT
in DECIMAL
.
CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO
D. Hinzufügen einer Spalte mit einer Einschränkung
Das folgende Beispiel fügt eine neue Spalte mit einer UNIQUE
-Einschränkung hinzu.
CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO
E. Hinzufügen einer nicht überprüften CHECK-Einschränkung zu einer vorhandenen Spalte
Das folgende Beispiel fügt einer vorhandenen Spalte in der Tabelle eine Einschränkung hinzu. Die Spalte hat einen Wert, der die Einschränkung verletzt. Deshalb wird WITH NOCHECK
verwendet, um zu verhindern, dass die Einschränkung in Bezug auf vorhandene Zeilen überprüft wird, und um das Hinzufügen der Einschränkung zu ermöglichen.
CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO
F. Hinzufügen einer DEFAULT-Einschränkung zu einer vorhandenen Spalte
Das folgende Beispiel erstellt eine Tabelle mit zwei Spalten und fügt einen Wert in die erste Spalte ein, während die andere Spalte NULL bleibt. Anschließend wird der zweiten Spalte eine DEFAULT
-Einschränkung hinzugefügt. Um zu überprüfen, ob der Standardwert angewendet wird, wird ein weiterer Wert in die erste Spalte eingefügt und die Tabelle abgefragt.
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO
G. Hinzufügen mehrerer Spalten mit Einschränkungen
Das folgende Beispiel fügt mehrere Spalten mit Einschränkungen hinzu, die mit der neuen Spalte definiert werden. Die erste neue Spalte weist eine IDENTITY
-Eigenschaft auf. Jede Zeile in der Tabelle besitzt neue inkrementelle Werte in der Identitätsspalte.
CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD
-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,
-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),
-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),
-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO
H. Hinzufügen einer Spalte, die NULL-Werte zulässt, mit Standardwerten
Das folgende Beispiel fügt eine Spalte, die NULL-Werte zulässt, mit einer DEFAULT
-Definition hinzu und verwendet WITH VALUES
, um Werte für jede vorhandene Zeile in der Tabelle bereitzustellen. Ohne WITH VALUES hat jede Zeile den Wert NULL in der neuen Spalte.
USE AdventureWorks ;
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO
I. Deaktivieren und erneutes Aktivieren einer Einschränkung
Das folgende Beispiel deaktiviert eine Einschränkung, die die in den Daten akzeptierten Gehälter begrenzt. NOCHECK CONSTRAINT
wird zusammen mit ALTER TABLE
verwendet, um die Einschränkung zu deaktivieren und eine Einfügung zuzulassen, die die Einschränkung normalerweise verletzen würde. CHECK CONSTRAINT
aktiviert die Einschränkung wieder.
CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;
J. Löschen einer Einschränkung
Das folgende Beispiel entfernt eine UNIQUE
-Einschränkung aus einer Tabelle.
CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO
K. Wechseln von Partitionen zwischen Tabellen
Das folgende Beispiel erstellt eine partitionierte Tabelle, wobei vorausgesetzt wird, dass das myRangePS1
-Partitionsschema bereits in der Datenbank erstellt wurde. Anschließend wird eine nicht partitionierte Tabelle mit derselben Struktur wie die partitionierte Tabelle und in derselben Dateigruppe wie PARTITION 2
der PartitionTable
-Tabelle erstellt. Die Daten von PARTITION 2
der PartitionTable
-Tabelle werden dann in die NonPartitionTable
-Tabelle verschoben.
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO
L. Deaktivieren und erneutes Aktivieren eines Triggers
Das folgende Beispiel verwendet die DISABLE TRIGGER
-Option von ALTER TABLE
, um den Trigger zu deaktivieren und eine Einfügung zuzulassen, die den Trigger normalerweise auslösen würde. Anschließend wird der Trigger mit ENABLE TRIGGER
wieder aktiviert.
CREATE TABLE dbo.trig_example
(id INT,
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print 'TRIG1 Error: you attempted to insert a salary > $100,000'
ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO
M. Erstellen einer PRIMARY KEY-Einschränkung mit Indexoptionen
Das folgende Beispiel erstellt die PRIMARY KEY-Einschränkung PK_TransactionHistoryArchive_TransactionID
und legt die Optionen FILLFACTOR
, ONLINE
und PAD_INDEX
fest. Der entstehende gruppierte Index hat denselben Namen wie die Einschränkung.
USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON)
GO
N. Löschen einer PRIMARY KEY-Einschränkung im ONLINE-Modus
Das folgende Beispiel löscht eine PRIMARY KEY-Einschränkung, wobei die Option ONLINE
auf ON
festgelegt wird.
USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
O. Hinzufügen und Löschen einer FOREIGN KEY-Einschränkung
Das folgende Beispiel erstellt die ContactBackup
-Tabelle und ändert sie, indem zuerst eine FOREIGN KEY
-Einschränkung hinzugefügt wird, die auf die Contact
-Tabelle verweist, und dann die FOREIGN KEY
-Einschränkung gelöscht wird.
USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Contact (ContactID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;
P. Ändern der Größe einer Spalte
Im folgenden Beispiel werden die Größe einer varchar-Spalte und die Genauigkeit und Dezimalstellen einer decimal-Spalte erhöht. Da die Spalten Daten enthalten, kann die Spaltengröße nur erhöht werden. Beachten Sie auch, dass col_a
in einem eindeutigen Index definiert wird. Die Größe von col_a
kann weiter erhöht werden, da der Datentyp varchar ist und der Index nicht das Ergebnis einer PRIMARY KEY-Eischränkung ist.
IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL
DROP TABLE dbo.doc_exy;
GO
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
Siehe auch
Verweis
sp_rename (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP TABLE (Transact-SQL)
sp_help (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
EVENTDATA (Transact-SQL)
Andere Ressourcen
Erstellen und Ändern von Tabellen
Vornehmen von Schemaänderungen in Publikationsdatenbanken
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
15. September 2007 |
|
12. Dezember 2006 |
|
14. April 2006 |
|
05. Dezember 2005 |
|