Скрипт T-SQL для удаления всех связей между кучей таблиц в схеме и другими кучами в другой схеме? - PullRequest
3 голосов
/ 13 апреля 2010

У меня есть набор таблиц (скажем, Account, Customer) в схеме (скажем, dbo), и у меня есть несколько других таблиц (скажем, Order, OrderItem) в другой схеме (скажем, инвентарь). Существует связь между таблицей заказов и таблицей клиентов. Я хочу удалить все связи между таблицами в первой схеме (dbo) и таблицами во второй схеме (опись), не удаляя связи между таблицами внутри одной схемы.

Это возможно? Любая помощь приветствуется.

Ответы [ 4 ]

7 голосов
/ 14 апреля 2010

Использовать метаданные:

SELECT  *
FROM    INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
WHERE   CONSTRAINT_NAME IN ( SELECT CONSTRAINT_NAME
                             FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                             WHERE  CONSTRAINT_TYPE = 'FOREIGN KEY' )
SELECT  *
FROM    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE   CONSTRAINT_NAME IN ( SELECT CONSTRAINT_NAME
                             FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                             WHERE  CONSTRAINT_TYPE = 'FOREIGN KEY' )
SELECT  *
FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE   CONSTRAINT_TYPE = 'FOREIGN KEY'

Добавьте критерии фильтрации, чтобы найти ограничения, которые вы хотите DROP, затем вставьте их в шаблон:

ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME}

И выполнить с динамическим SQL.

5 голосов
/ 14 апреля 2010

вы можете получить доступные FK, которые существуют в вашей БД, по приведенному ниже сценарию, а затем удалить их:

select * from sys.objects o
join sys.schemas s on o.schema_id = s.schema_id
where o.type = 'F'

после этого удалите, как показано ниже

ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME}
3 голосов
/ 15 августа 2015

Пожалуйста, используйте приведенный ниже скрипт, скопировав и вставив его в SQL Studio:

SELECT  'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP [' + CONSTRAINT_NAME + ']'
FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE   CONSTRAINT_TYPE = 'FOREIGN KEY'
1 голос
/ 14 апреля 2010

Я не буду клясться, что это сработает в SQL 2005, так как у меня нет экземпляра для его тестирования, но если он это сделает, это сделает простое задание копирования / вставки в SSMS. Я предоставлю вам возможность повторять результаты и выполнять, если вы этого хотите.

Замените schema_1 и schema_2 именами схем, между которыми вы пытаетесь найти отношения.

declare @s1 int
declare @s2 int

set @s1 = schema_id( 'schema_1' )
set @s2 = schema_id( 'schema_2' )

select
     N'alter table [' + s.name + N'].[' + o_p.name + N'] drop constraint [' + fk.name + N']'
from sys.foreign_keys fk
join sys.schemas s on ( s.schema_id = fk.schema_id )
join sys.objects o_p on ( o_p.object_id = fk.parent_object_id )
join sys.objects o_r on ( o_r.object_id = fk.referenced_object_id )
where
        ( o_p.schema_id = @s1 and o_r.schema_id = @s2 )
    or  ( o_p.schema_id = @s2 and o_r.schema_id = @s1 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...