SQL Server 2008 R2 にデータベースがあり、多くのテーブル (200 以上) があり、テーブル間に多くの関係があります。 ほとんどのリレーションの削除ルールはアクションなしすべてのリレーション削除ルールを一度にカスケード に更新する必要があります データベース内のリレーションが多すぎるため、これを 1 つずつ実行したくありません 方法はありますか?
質問する
67 次
1 に答える
1
通常、SSMS GUI を使用して外部キー制約を ALTER すると、バックグラウンドの SQL Server は実際に同じものを削除して再作成します。
すべての FKey を削除し、ON UPDATE CASCADE ON DELETE CASCADE
オプションを使用してそれらを再作成するための SQL を生成するスクリプトを次に示します。
前提として、すべての FKey は「FK .....」という名前です。
SET NOCOUNT ON;
DECLARE @Objects TABLE
(
ID int identity(1,1),
TableName sysname,
SchemaName sysname
)
INSERT INTO @Objects (TableName, SchemaName)
SELECT
TABLE_NAME,
CONSTRAINT_SCHEMA
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%'
DECLARE @min int, @max int,@table sysname,@schema sysname
SELECT @min = 1, @max = MAX(ID) FROM @Objects
WHILE @min <=@max
BEGIN
SELECT
@table = TableName,@schema = SchemaName FROM @Objects WHERE ID = @min
print '/*Drop Foreign Key Statements for [' + @schema + '].[' + @table + ']*/'
SELECT
'ALTER TABLE [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']
DROP CONSTRAINT [' + fk.name + ']'
FROM sys.foreign_keys fk
INNER JOIN sys.objects o
ON fk.parent_object_id = o.object_id
WHERE o.name = @table AND
SCHEMA_NAME(o.schema_id) = @schema
print '/*Create Foreign Key Statements for ['
+ @schema + '].[' + @table + ']*/'
SELECT
'ALTER TABLE [' + SCHEMA_NAME(o.schema_id) + '].[' + o.name + ']
ADD CONSTRAINT [' + fk.name + '] FOREIGN KEY ([' + c.name + '])
REFERENCES [' + SCHEMA_NAME(refob.schema_id) + '].[' + refob.name + ']
([' + refcol.name + '])ON UPDATE CASCADE ON DELETE CASCADE'
FROM sys.foreign_key_columns fkc
INNER JOIN sys.foreign_keys fk
ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.objects o
ON fk.parent_object_id = o.object_id
INNER JOIN sys.columns c
ON fkc.parent_column_id = c.column_id AND
o.object_id = c.object_id
INNER JOIN sys.objects refob
ON fkc.referenced_object_id = refob.object_id
INNER JOIN sys.columns refcol
ON fkc.referenced_column_id = refcol.column_id AND
fkc.referenced_object_id = refcol.object_id
WHERE o.name = @table AND
SCHEMA_NAME(o.schema_id) = @schema
SET @min = @min+1
END
お役に立てれば。
ラージ
PS: クエリ出力をテキストに設定すると役立ちます。また、あなたの質問に投稿されたコメントを読んでください。恣意的に設定CASCADE
することは正しいことではないかもしれません
于 2013-05-20T11:47:29.537 に答える