Wird die Tabelle gesperrt, wenn die Größe einer Spalte geändert wird?

Wird die Tabelle gesperrt, wenn die Größe einer Spalte geändert wird?

Was passiert, wenn ich eine Spalte von nvarchar(2) in nvarchar(10) oder eine Spalte von char(2) in nvarchar(10) ändere? Wird dadurch die Tabelle gesperrt oder neu organisiert oder funktioniert dies ohne Auswirkungen oder Ausfallzeiten?

Ich habe versucht herauszufinden, was passiert, wenn ich eine Spalte ändere, aber ich habe nichts gefunden. Es ist eine große Tabelle mit einer oder zwei Spalten, die geändert werden müssen. Es geht um einen MS SQL Server 2008 R2.

Antwort1

Der einfachste Weg, dies herauszufinden, besteht darin, in einer Testumgebung eine Dummy-Tabelle und einige Dummy-Datensätze zu erstellen, die besprochenen Änderungen anzuwenden und die Aktionen anschließend über den Profiler zu verfolgen.

ODER Ändern Sie die Tabelle in der in SSMS entworfenen Tabelle und verwenden Sie dann die Schaltfläche „Änderungsskript generieren“. Wenn ich meine Spalte von Char(2) in NVARCHAR(10) ändere, erzeugt das generierte Änderungsskript Folgendes:

   CREATE TABLE dbo.Tmp_t2
    (
    id int NULL,
    c1 nvarchar(50) NULL,
    c2 nvarchar(2) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_t2 SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.t2)
     EXEC('INSERT INTO dbo.Tmp_t2 (id, c1, c2)
        SELECT id, CONVERT(nvarchar(50), c1), c2 FROM dbo.t2 WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.t2
GO
EXECUTE sp_rename N'dbo.Tmp_t2', N't2', 'OBJECT' 
GO
COMMIT

Antwort2

Wenn Sie die ALTER-Befehle verwenden, wird eine weitere Tabelle erstellt, die vorhandenen Daten werden in die neue Tabelle kopiert, die alte Tabelle wird nach Abschluss gelöscht und die neue Tabelle wird mit dem alten Tabellennamen umbenannt. Ich glaube nicht, dass es die beste Vorgehensweise ist, dies während einer Live-Datenbank zu tun, aber es gibt Methoden, um mit Produktionsdaten umzugehen.

http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx

Antwort3

Wenn der Datentyp einer Tabellenspalte geändert wird, können keine anderen Vorgänge (wie Einfügen, Aktualisieren, Löschen) ausgeführt werden. Die ganze Tabelle wird gesperrt. Außerdem ist eine Auswahl mit NOLOCK nicht möglich.

verwandte Informationen