少し面倒ですが、列をnull許容として追加し、制約を追加し、既存の行に格納する値を決定してから、列をNOTNULLにすることで実行できます。また、サポートされていない、文書化されていないストアドプロシージャも避けたいと思います。sp_MSforeachdbの問題を発見しました(ここで回避策があります)。これがここでも現れる可能性があります。これは私がこれを達成する方法です:
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10) + N'ALTER TABLE '
+ QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
+ QUOTENAME(name)
+ ' ADD ChangedBy NVARCHAR(100) NOT NULL;
ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
+ QUOTENAME(name) + ' ADD CONSTRAINT DF_' + name
+ '_ChangedBy DEFAULT (SUSER_SNAME()) FOR ChangedBy;
UPDATE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
+ QUOTENAME(name) + ' SET ChangedBy = N''pre-existing'';
ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
+ QUOTENAME(name) + ' ALTER COLUMN ChangedBy NVARCHAR(100) NOT NULL;'
FROM sys.tables WHERE is_ms_shipped = 0;
PRINT @sql;
--EXEC sys.sp_executesql @sql;
(期待どおりに機能していると確信できる場合は、コメントを変更してください。PRINT出力にコマンド全体が表示されない場合があることに注意してください。使用しているテーブルの数によっては、切り捨てられる可能性があります。TOP1またはsys.tablesに対する追加のWHERE句を使用して、単一のテーブルのコマンドセットがどのようになるかを確認します。)
後で制約の名前を変更することもできます。
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + CHAR(13) + CHAR(10)
+ N'EXEC sp_rename N''' + c.name + ''',N''DF_' + t.name
+ '_ChangedBy'', N''OBJECT'';'
FROM sys.default_constraints AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
WHERE c.name LIKE 'DF[_]%[_]Change[_]%'
AND LOWER(c.[definition]) LIKE '%suser%';
PRINT @sql;
--EXEC sys.sp_executesql @sql;
これらのスクリプトはどちらも、のようなばかげたオブジェクト名がないことを前提としています1 of My Friend's Cool High % Table!
。