2013-05-20 27 views
0

我有一个数据库在SQL Server 2008 R2有很多表(超过200),并有许多表之间的关系。 在最关系的删除规则是无动作 我需要一个 是更新到级联一次 因为在我的数据库太多关系的所有关系删除规则我不想做一个有什么办法?在sql server中更新所有外键约束?

+1

在任何适度复杂的数据库中,可能存在多个级联路径,SQL Server的级联选项不允许使用这些级联路径 - 因此,您需要仔细规划哪些路径实际上会转向(然后或者离开其余的,或者你将不得不通过触发器来实现) –

+0

@Damien_The_Unbeliever:另外,在任何适度复杂的数据库中,几乎肯定会有至少一些外键不应该级联更新或删除。 –

回答

1

通常,当您使用SSMS GUI修改外键约束时,后台上的SQL Server实际上会丢弃并重新创建相同的内容。

这里是一个脚本,将生成的SQL全部丢弃FKeys与ON UPDATE CASCADE ON DELETE CASCADE选项

假设是重新创建它们,你的所有FKeys是名“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 <[email protected] 
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可能不是正确的做法

+0

你的查询只是显示命令做的。你可以改变它执行? –

+0

DDL查询需要在执行前进行审查。是否可以复制输出并在新的查询窗口中执行? – Raj