SSMSで列の挿入を行った時、中でどんなスクリプトが生成されているのか
列挿入操作をしたあと、保存する前に右クリックすると変更スクリプトの生成が選択可能になっている
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 /* ここの桁を変えたい */
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
GO
COMMIT
やってること自体は泥臭かった
1. tmpテーブルを作る
2. 移行元テーブルのデータをtmpテーブルに退避
3. 設定をやり直し…
「テーブルA」に対して、挿入したい列定義を持った「Tmp_テーブルA」をCREATE
テーブルによってはいっぱい追加削除をするから、事前にロックの粒度を大きくしているのかと思ったけど 規定値=TABLEをセットしている
念のためなのかな?
今のテーブルAの中身をTmp_テーブルAにINSERT
Tmp_テーブルAをテーブルAにリネーム
オプションの量は尋常じゃなかった
全部はわからなかった
これを改めてちゃんと見る(2023/10/19)
使われているコマンド
SET
tmpテーブルを作成
移行元テーブルの内容をtmpテーブルにinsert、WITHでテーブルヒントを付加 移行元テーブルをdrop
tmpテーブルを移行元テーブル名にリネーム
テーブル設定を戻す
ALTER TABLE dbo.SAMPLE_TABLE ADD CONSTRAINT
PK_SAMPLE_TABLE PRIMARY KEY CLUSTERED (
user_id, user_name, password
関連