Проверка внешнего ключа перед добавлением его с помощью сценария SQL - PullRequest
2 голосов
/ 13 декабря 2010

У меня есть сценарий SQL, который добавляет внешний ключ в таблицу, как показано ниже.

ALTER TABLE [security].[Pages] WITH NOCHECK
ADD CONSTRAINT [FK_Pages_PageClasses] FOREIGN KEY ([PageClassId]) REFERENCES [security].[PageClasses]([PageClassId]) ON DELETE NO ACTION ON UPDATE NO ACTION;

Иногда в таблице уже есть этот внешний ключ, поэтому при запуске из Management Studio отображается ошибка. Можно ли добавить запрос, чтобы проверить, существует ли ключ перед его применением? Есть лучший способ сделать это? Это должно работать для MS SQL 2005 и 2008.

Ответы [ 2 ]

11 голосов
/ 13 декабря 2010

Используйте функцию OBJECT_ID для проверки существования.

IF OBJECT_ID('[security].[FK_Pages_PageClasses]') IS NULL
    ALTER TABLE [security].[Pages] WITH NOCHECK
        ADD CONSTRAINT [FK_Pages_PageClasses] FOREIGN KEY ([PageClassId]) REFERENCES [security].[PageClasses]([PageClassId]) ON DELETE NO ACTION ON UPDATE NO ACTION;
1 голос
/ 13 декабря 2010

Проверить наличие внешнего ключа можно, просмотрев каталог объектов sys.foreign_keys :

IF NOT EXISTS(SELECT * FROM sys.foreign_keys WHERE object_id = object_id(N'[Security].[FK_Pages_PageClasses]') and parent_object_id = object_id(N'[Security].[Pages]'))
BEGIN
    ALTER TABLE [security].[Pages] WITH NOCHECK
    ADD CONSTRAINT [FK_Pages_PageClasses] FOREIGN KEY ([PageClassId]) REFERENCES [security].[PageClasses]([PageClassId]) ON DELETE NO ACTION ON UPDATE NO ACTION;
END
...