Вот код SQL, который я бы использовал.
SELECT
f.name AS 'Name of Foreign Key',
OBJECT_NAME(f.parent_object_id) AS 'Table name',
COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Fieldname',
OBJECT_NAME(t.object_id) AS 'References Table name',
COL_NAME(t.object_id,fc.referenced_column_id) AS 'References fieldname',
'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + '] DROP CONSTRAINT [' + f.name + ']' AS 'Delete foreign key',
'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + '] WITH NOCHECK ADD CONSTRAINT [' +
f.name + '] FOREIGN KEY([' + COL_NAME(fc.parent_object_id,fc.parent_column_id) + ']) REFERENCES ' +
'[' + OBJECT_NAME(t.object_id) + '] ([' +
COL_NAME(t.object_id,fc.referenced_column_id) + '])' AS 'Create foreign key'
-- , delete_referential_action_desc AS 'UsesCascadeDelete'
FROM sys.foreign_keys AS f,
sys.foreign_key_columns AS fc,
sys.tables t
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
AND OBJECT_NAME(t.object_id) = 'Employees' -- Just show the FKs which reference a particular table
ORDER BY 2
Это не совсем понятный SQL, поэтому давайте рассмотрим пример.
Итак, предположим, что я хотел удалить таблицу Employees
в любимой базе данных Microsoft Northwind
, но SQL Server сказал мне, что один или несколько внешних ключей мешали мне сделать это.
Команда SQL, приведенная выше, вернет эти результаты ...
Это показывает, что есть 3 внешних ключа, которые ссылаются на таблицу Employees
. Другими словами, мне не разрешили бы удалить (удалить) эту таблицу, пока эти три внешних ключа не будут сначала удалены.
В результатах первая строка показывает, как в результатах будет показано следующее ограничение внешнего ключа.
ALTER TABLE [dbo].[Employees] WITH NOCHECK
ADD CONSTRAINT [FK_Employees_Employees] FOREIGN KEY([ReportsTo])
REFERENCES [dbo].[Employees] ([EmployeeID])
В последнем столбце показана команда SQL, которую мне нужно будет использовать для удаления одного из этих внешних ключей, например:
ALTER TABLE [Employees] DROP CONSTRAINT [FK_Employees_Employees]
... и в правом столбце показан SQL для create it ...
ALTER TABLE [Employees] WITH NOCHECK
ADD CONSTRAINT [FK_Employees_Employees]
FOREIGN KEY([ReportsTo]) REFERENCES [Employees] ([EmployeeID])
Со всеми этими командами у вас есть все, что нужно для удаления соответствующих внешних ключей, чтобы вы могли удалить таблицу, а затем воссоздать их позже.
Уф. Надеюсь, это поможет.