0

SQL Server 2008 R2 にデータベースがあり、多くのテーブル (200 以上) があり、テーブル間に多くの関係があります。 ほとんどのリレーションの削除ルールはアクションなしすべてのリレーション削除ルールを一度にカスケード に更新する必要があります データベース内のリレーションが多すぎるため、これを 1 つずつ実行したくありません 方法はありますか?

4

1 に答える 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 に答える