Solo comenta/descomenta la variable @action para tener el script para borrar y crear las llaves foráneas.
DECLARE @schema_name SYSNAME;
DECLARE @table_name SYSNAME;
DECLARE @constraint_name SYSNAME;
DECLARE @constraint_object_id INT;
DECLARE @referenced_object_name SYSNAME;
DECLARE @is_disabled BIT;
DECLARE @is_not_for_replication BIT;
DECLARE @is_not_trusted BIT;
DECLARE @delete_referential_action TINYINT;
DECLARE @update_referential_action TINYINT;
DECLARE @tsql NVARCHAR(4000);
DECLARE @tsql2 NVARCHAR(4000);
DECLARE @fkCol SYSNAME;
DECLARE @pkCol SYSNAME;
DECLARE @col1 BIT;
DECLARE @action CHAR(6);
DECLARE @referenced_schema_name SYSNAME;
--SET @action = 'DROP';
SET @action = 'CREATE';
DECLARE fkcursor CURSOR FOR
SELECT Object_schema_name(parent_object_id),
Object_name(parent_object_id),
name,
Object_name(referenced_object_id),
object_id,
is_disabled,
is_not_for_replication,
is_not_trusted,
delete_referential_action,
update_referential_action,
Object_schema_name(referenced_object_id)
FROM sys.foreign_keys
ORDER BY 1,
2;
OPEN fkcursor;
FETCH next FROM fkcursor INTO @schema_name, @table_name, @constraint_name,
@referenced_object_name, @constraint_object_id, @is_disabled,
@is_not_for_replication, @is_not_trusted, @delete_referential_action,
@update_referential_action, @referenced_schema_name;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @action <> 'CREATE'
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name)
+ ' DROP CONSTRAINT '
+ Quotename(@constraint_name) + ';';
ELSE
BEGIN
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name) + CASE @is_not_trusted WHEN 0
THEN
' WITH CHECK ' ELSE ' WITH NOCHECK ' END
+ ' ADD CONSTRAINT '
+ Quotename(@constraint_name)
+ ' FOREIGN KEY (';
SET @tsql2 = '';
DECLARE columncursor CURSOR FOR
SELECT Col_name(fk.parent_object_id, fkc.parent_column_id),
Col_name(fk.referenced_object_id, fkc.referenced_column_id)
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc
ON fk.object_id = fkc.constraint_object_id
WHERE fkc.constraint_object_id = @constraint_object_id
ORDER BY fkc.constraint_column_id;
OPEN columncursor;
SET @col1 = 1;
FETCH next FROM columncursor INTO @fkCol, @pkCol;
WHILE @@FETCH_STATUS = 0
BEGIN
IF ( @col1 = 1 )
SET @col1 = 0;
ELSE
BEGIN
SET @tsql = @tsql + ',';
SET @tsql2 = @tsql2 + ',';
END;
SET @tsql = @tsql + Quotename(@fkCol);
SET @tsql2 = @tsql2 + Quotename(@pkCol);
FETCH next FROM columncursor INTO @fkCol, @pkCol;
END;
CLOSE columncursor;
DEALLOCATE columncursor;
SET @tsql = @tsql + ' ) REFERENCES '
+ Quotename(@referenced_schema_name) + '.'
+ Quotename(@referenced_object_name) + ' ('
+ @tsql2 + ')';
SET @tsql = @tsql + ' ON UPDATE ' + CASE @update_referential_action
WHEN 0
THEN 'NO ACTION '
WHEN 1 THEN 'CASCADE ' WHEN 2 THEN 'SET NULL ' ELSE
'SET DEFAULT '
END + ' ON DELETE ' + CASE @delete_referential_action
WHEN
0
THEN
'NO ACTION ' WHEN 1 THEN 'CASCADE ' WHEN 2 THEN
'SET NULL '
ELSE
'SET DEFAULT ' END + CASE @is_not_for_replication WHEN 1
THEN
' NOT FOR REPLICATION ' ELSE '' END
+ ';';
END;
PRINT @tsql;
IF @action = 'CREATE'
BEGIN
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name) + CASE @is_disabled WHEN 0 THEN
' CHECK '
ELSE ' NOCHECK ' END + 'CONSTRAINT '
+ Quotename(@constraint_name) + ';';
PRINT @tsql;;
END;
FETCH next FROM fkcursor INTO @schema_name, @table_name, @constraint_name,
@referenced_object_name, @constraint_object_id, @is_disabled,
@is_not_for_replication, @is_not_trusted, @delete_referential_action,
@update_referential_action, @referenced_schema_name;
END;
CLOSE fkcursor;
DEALLOCATE fkcursor;
DECLARE @schema_name SYSNAME;
DECLARE @table_name SYSNAME;
DECLARE @constraint_name SYSNAME;
DECLARE @constraint_object_id INT;
DECLARE @referenced_object_name SYSNAME;
DECLARE @is_disabled BIT;
DECLARE @is_not_for_replication BIT;
DECLARE @is_not_trusted BIT;
DECLARE @delete_referential_action TINYINT;
DECLARE @update_referential_action TINYINT;
DECLARE @tsql NVARCHAR(4000);
DECLARE @tsql2 NVARCHAR(4000);
DECLARE @fkCol SYSNAME;
DECLARE @pkCol SYSNAME;
DECLARE @col1 BIT;
DECLARE @action CHAR(6);
DECLARE @referenced_schema_name SYSNAME;
--SET @action = 'DROP';
SET @action = 'CREATE';
DECLARE fkcursor CURSOR FOR
SELECT Object_schema_name(parent_object_id),
Object_name(parent_object_id),
name,
Object_name(referenced_object_id),
object_id,
is_disabled,
is_not_for_replication,
is_not_trusted,
delete_referential_action,
update_referential_action,
Object_schema_name(referenced_object_id)
FROM sys.foreign_keys
ORDER BY 1,
2;
OPEN fkcursor;
FETCH next FROM fkcursor INTO @schema_name, @table_name, @constraint_name,
@referenced_object_name, @constraint_object_id, @is_disabled,
@is_not_for_replication, @is_not_trusted, @delete_referential_action,
@update_referential_action, @referenced_schema_name;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @action <> 'CREATE'
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name)
+ ' DROP CONSTRAINT '
+ Quotename(@constraint_name) + ';';
ELSE
BEGIN
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name) + CASE @is_not_trusted WHEN 0
THEN
' WITH CHECK ' ELSE ' WITH NOCHECK ' END
+ ' ADD CONSTRAINT '
+ Quotename(@constraint_name)
+ ' FOREIGN KEY (';
SET @tsql2 = '';
DECLARE columncursor CURSOR FOR
SELECT Col_name(fk.parent_object_id, fkc.parent_column_id),
Col_name(fk.referenced_object_id, fkc.referenced_column_id)
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc
ON fk.object_id = fkc.constraint_object_id
WHERE fkc.constraint_object_id = @constraint_object_id
ORDER BY fkc.constraint_column_id;
OPEN columncursor;
SET @col1 = 1;
FETCH next FROM columncursor INTO @fkCol, @pkCol;
WHILE @@FETCH_STATUS = 0
BEGIN
IF ( @col1 = 1 )
SET @col1 = 0;
ELSE
BEGIN
SET @tsql = @tsql + ',';
SET @tsql2 = @tsql2 + ',';
END;
SET @tsql = @tsql + Quotename(@fkCol);
SET @tsql2 = @tsql2 + Quotename(@pkCol);
FETCH next FROM columncursor INTO @fkCol, @pkCol;
END;
CLOSE columncursor;
DEALLOCATE columncursor;
SET @tsql = @tsql + ' ) REFERENCES '
+ Quotename(@referenced_schema_name) + '.'
+ Quotename(@referenced_object_name) + ' ('
+ @tsql2 + ')';
SET @tsql = @tsql + ' ON UPDATE ' + CASE @update_referential_action
WHEN 0
THEN 'NO ACTION '
WHEN 1 THEN 'CASCADE ' WHEN 2 THEN 'SET NULL ' ELSE
'SET DEFAULT '
END + ' ON DELETE ' + CASE @delete_referential_action
WHEN
0
THEN
'NO ACTION ' WHEN 1 THEN 'CASCADE ' WHEN 2 THEN
'SET NULL '
ELSE
'SET DEFAULT ' END + CASE @is_not_for_replication WHEN 1
THEN
' NOT FOR REPLICATION ' ELSE '' END
+ ';';
END;
PRINT @tsql;
IF @action = 'CREATE'
BEGIN
SET @tsql = 'ALTER TABLE ' + Quotename(@schema_name) + '.'
+ Quotename(@table_name) + CASE @is_disabled WHEN 0 THEN
' CHECK '
ELSE ' NOCHECK ' END + 'CONSTRAINT '
+ Quotename(@constraint_name) + ';';
PRINT @tsql;;
END;
FETCH next FROM fkcursor INTO @schema_name, @table_name, @constraint_name,
@referenced_object_name, @constraint_object_id, @is_disabled,
@is_not_for_replication, @is_not_trusted, @delete_referential_action,
@update_referential_action, @referenced_schema_name;
END;
CLOSE fkcursor;
DEALLOCATE fkcursor;
Muchas gracias, este tipo de tools son muy buenos
ResponderBorrar