добавление ограничения, которое проверяет существование хранимой процедуры - PullRequest
1 голос
/ 18 ноября 2010

Я использую SQL Server 2005, и в одной из таблиц у меня есть столбец, в котором хранится сохраненное имя процесса.При вставке значений в этот столбец я хочу убедиться, что в базе данных существует сохраненный процесс с этим именем.

ALTER TABLE MyTable WITH CHECK 
   ADD CONSTRAINT [CK_MyTable_MyColumn] CHECK ((SELECT COUNT(*)  FROM sys.sysobjects WHERE id = object_id(MyColumn) AND OBJECTPROPERTY(id, N'IsProcedure')=1) = 1)

, но это приводит к следующей ошибке

Подзапросы не допускаютсяв данном контексте.Допускаются только скалярные выражения.

Как я могу это сделать.

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

Разрешены функции:

create function dbo.IsProcedure(@ProcName sysname) returns bit as
return (SELECT COUNT(*) FROM sys.sysobjects 
  where id = object_id(MyColumn) and OBJECTPROPERTY(id, N'IsProcedure')=1);
go

ALTER TABLE MyTable WITH CHECK ADD CONSTRAINT [CK_MyTable_MyColumn]
CHECK (dbo.IsProcedure(MyColumn) = 1);
2 голосов
/ 18 ноября 2010

Обратите внимание, что этот тип ограничения гарантированно будет истинным только во время вставки или обновления записи. Proc может быть удален без последствий. Возможно, вам понадобится добавить триггер DDL, чтобы перехватывать пропущенные объекты, на которые есть ссылки в таблице, и / или процедуру сообщения об исключительной ситуации, которая выполняется регулярно для мониторинга состояния вашей системы, чтобы убедиться, что любая процедура в таблице действительно существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...