Я пытаюсь добавить столбец к концу таблицы в SQL следующим образом:
- Открыть представление Design
- Добавить столбец
- Создайте и скопируйте скрипт
- Запустите, затем сохраните скрипт
По какой-то причине, когда мои коллеги делают это, он генерирует обычный скрипт ALTER TABLE
.
Когда я пытаюсь это сделать, он генерирует скрипт, который создает временную таблицу, затем удаляет существующую таблицу, а затем заменяет исходную таблицу временной таблицей, например:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Table_Name
DROP CONSTRAINT DF_Table_Name_NewColumnName
GO
CREATE TABLE dbo.Tmp_Table_Name
(
Id int NOT NULL IDENTITY (1, 1),
Column1 varchar(16) NOT NULL,
NewColumnName int NOT NULL,
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table_Name SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_Table_Name ADD CONSTRAINT
DF_Table_Name_NewColumnName DEFAULT ((1)) FOR NewColumnName
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name ON
GO
IF EXISTS(SELECT * FROM dbo.Table_Name)
EXEC('INSERT INTO dbo.Tmp_Table_Name (Id, Column1, NewColumnName)
SELECT Id, Column1, NewColumnName FROM dbo.Table_Name WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table_Name OFF
GO
DROP TABLE dbo.Table_Name
GO
EXECUTE sp_rename N'dbo.Tmp_Table_Name', N'Table_Name', 'OBJECT'
GO
ALTER TABLE dbo.Table_Name ADD CONSTRAINT
PK_Table_Name PRIMARY KEY CLUSTERED
(
Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
Я могу понять, почемуэто может быть сделано, если я удаляю столбцы или добавляю столбцы в середине таблицы, но это не так, я просто добавляю столбец в конец таблицы.
Эта проблема имеетфактически заставил SQL Server удалить все данные в таблице, если с дизайном что-то не так (изначально я понял это, забыв добавить значение по умолчанию в необходимый столбец, он стер все данные в таблице. К счастью, только всреда разработки).