SSMSで列の挿入を行った時、中でどんなスクリプトが生成されているのか
from SQL Serverでテーブルの途中に列を追加する
実際に変更スクリプトの生成を実行して、上記リンクの操作をSQLで出力してみる
列挿入操作をしたあと、保存する前に右クリックすると変更スクリプトの生成が選択可能になっている
変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。
code:生成したスクリプト.sql
/*
日付
ユーザー:
サーバー: SAMPLE_DOMAIN
データベース: SAMPLE_DB
アプリケーション:
*/
/* データ損失のイシューを防ぐため、データベース デザイナーのコンテキスト外でこのスクリプトを実行する前に、スクリプトの詳細を確認してください。*/
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
CREATE TABLE dbo.Tmp_SAMPLE_TABLE (
user_id int NOT NULL,
user_name varchar(40) NOT NULL,
password varchar(256) NOT NULL /* ここの桁を変えたい */
) ON PRIMARY
GO
ALTER TABLE dbo.Tmp_SAMPLE_TABLE SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.SAMPLE_TABLE)
EXEC('INSERT INTO dbo.Tmp_SAMPLE_TABLE (user_id, user_name, password)
SELECT user_id, user_name, password FROM dbo.SAMPLE_TABLE
WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.SAMPLE_TABLE
GO
EXECUTE sp_rename N'dbo.Tmp_SAMPLE_TABLE', N'SAMPLE_TABLE', 'OBJECT'
GO
ALTER TABLE dbo.SAMPLE_TABLE ADD CONSTRAINT
PK_SAMPLE_TABLE PRIMARY KEY CLUSTERED (
user_id, user_name, password
) WITH( STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON PRIMARY
GO
COMMIT
やってること自体は泥臭かった
1. tmpテーブルを作る
2. 移行元テーブルのデータをtmpテーブルに退避
3. 設定をやり直し…
「テーブルA」に対して、挿入したい列定義を持った「Tmp_テーブルA」をCREATE
ロックエスカレーションの設定
テーブルによってはいっぱい追加削除をするから、事前にロックの粒度を大きくしているのかと思ったけど
規定値=TABLEをセットしている
念のためなのかな?
今のテーブルAの中身をTmp_テーブルAにINSERT
テーブルAをDROP
Tmp_テーブルAをテーブルAにリネーム
ALTER TABLEでPK等を設定しなおし
オプションの量は尋常じゃなかった
全部はわからなかった
これを改めてちゃんと見る(2023/10/19)
使われているコマンド
SET
QUOTED_IDENTIFIER ON
ARITHABORT ON
NUMERIC_ROUNDABORT OFF
CONCAT_NULL_YIELDS_NULL ON
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
tmpテーブルを作成
tmpテーブルのロックエスカレーションの設定を変更する
LOCK_ESCALATION = TABLE
移行元テーブルの内容をtmpテーブルにinsert、WITHでテーブルヒントを付加
WITH (HOLDLOCK TABLOCKX)
移行元テーブルをdrop
tmpテーブルを移行元テーブル名にリネーム
sp_rename
テーブル設定を戻す
ALTER TABLE dbo.SAMPLE_TABLE ADD CONSTRAINT
PK_SAMPLE_TABLE PRIMARY KEY CLUSTERED (
user_id, user_name, password
) WITH( STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON PRIMARY
関連
同一データベース内で旧テーブルを新テーブルに移行する