У меня есть этот sql:
ALTER TABLE dbo.ChannelPlayerSkins
DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
но, очевидно, в некоторых других базах данных, которые мы используем, ограничение имеет другое имя. Как я могу проверить, есть ли ограничение с именем FK_ChannelPlayerSkins_Channels
.
sql-server
information-schema
system-tables
Ливен Кардоен
источник
источник
Ответы:
попробуй это:
-- РЕДАКТИРОВАТЬ --
Когда я первоначально ответил на этот вопрос, я думал «Внешний ключ», потому что первоначальный вопрос задавался о поиске «FK_ChannelPlayerSkins_Channels». С тех пор многие люди прокомментировали поиск других «ограничений», вот некоторые другие запросы для этого:
вот альтернативный метод
Если вам нужна дополнительная информация об ограничениях, загляните в системную хранимую процедуру,
master.sys.sp_helpconstraint
чтобы узнать, как получить определенную информацию. Для просмотра исходного кода с помощью SQL Server Management Studio перейдите в «Обозреватель объектов». Оттуда вы расширяете базу данных «Master», затем «Programmability», затем «Stored Programs», затем «System Stored Programs». Затем вы можете найти «sys.sp_helpconstraint» и щелкнуть по нему правой кнопкой мыши и выбрать «изменить». Просто будьте осторожны, чтобы не сохранить какие-либо изменения в нем. Кроме того, вы можете просто использовать эту системную хранимую процедуру для любой таблицы, используя ее какEXEC sp_helpconstraint YourTableNameHere
.источник
Самый простой способ проверить наличие ограничения (а затем сделать что-то, например, удалить его, если он существует) - использовать функцию OBJECT_ID () ...
OBJECT_ID может использоваться без второго параметра («C» только для проверочных ограничений), и это также может сработать, но если имя вашего ограничения совпадает с именем других объектов в базе данных, вы можете получить неожиданные результаты.
OBJECT_ID также может использоваться с другими «ограничениями», такими как ограничения внешнего ключа или ограничения первичного ключа и т. Д. Для достижения наилучших результатов всегда включайте соответствующий тип объекта в качестве второго параметра для функции OBJECT_ID:
Типы объектов ограничений:
Также обратите внимание, что схема часто требуется. Схема ограничений обычно принимает схему родительской таблицы.
Неспособность поместить ваши ограничения (или что вы проверяете) в скобки при использовании этого метода также может привести к ложному отрицанию - если ваш объект использует необычные символы (такие как.), Скобки требуются.
источник
OBJECTPROPERTY(OBJECT_ID('constraint_name'), 'IsConstraint') = 1
чтобы быть совместимым с текущей версией вплоть до sql2000. Нетdbo
схемы не требуется слишком.Если вы ищете другой тип ограничения, например, по умолчанию, вы должны использовать другой запрос (Из Как найти ограничение по умолчанию с помощью INFORMATION_SCHEMA? Ответил devio ). Использование:
найти ограничение по умолчанию по имени.
В своем сообщении я собрал различные проверки « ЕСЛИ НЕ СУЩЕСТВУЕТ», «УСЛОВИЯ ЕСЛИ НЕ СУЩЕСТВУЕТ», чтобы сценарии SQL были повторно запущены »
источник
источник
Вы смотрите на что-то вроде этого, ниже тестируется в SQL Server 2005
источник
Просто что-то остерегаться ......
В SQL Server 2008 R2 SSMS команда «Ограничение сценария как -> DROP And CREATE To» создает T-SQL, как показано ниже
Из этого скрипта НЕ удаляется ограничение, потому что SELECT возвращает 0 строк. (см. сообщение Microsoft Connect ).
Имя ограничения по умолчанию неверно, но я полагаю, что оно также имеет отношение к функции OBJECT_ID, потому что изменение имени не решает проблему.
Чтобы это исправить, я удалил использование OBJECT_ID и вместо этого использовал имя ограничения по умолчанию.
источник
OBJECT_ID(N'[YourSchema].[DEF_Detail_IsDeleted]')
если у вас есть 2 ограничения одного и того же имени в разных схемах.Я использую следующий запрос, чтобы проверить существующее ограничение, прежде чем создать его.
Это запрашивает ограничение по имени, ориентируясь на данное имя таблицы. Надеюсь это поможет.
источник
источник
источник
INFORMATION_SCHEMA
твой друг. Он имеет все виды представлений, которые показывают все виды информации о схеме. Проверьте ваши системные представления. Вы найдете у вас есть три вида , касающиеся ограничений, одно существоCHECK_CONSTRAINTS
.источник
Я использую это для проверки и удаленных ограничений на столбец. В нем должно быть все необходимое.
источник
источник
Вы можете использовать вышеупомянутое с одной оговоркой:
Необходимо использовать,
name = [Constraint name]
поскольку таблица может иметь несколько внешних ключей, но при этом внешний ключ не проверяется наисточник