Sql server 添加检查存储过程是否存在的约束

Sql server 添加检查存储过程是否存在的约束,sql-server,database,constraints,Sql Server,Database,Constraints,我使用的是SQLServer2005,其中一个表中有一列存储了存储的进程名。在该列中插入值时,我希望确保数据库中存在该名称的存储过程 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'IsProcedur

我使用的是SQLServer2005,其中一个表中有一列存储了存储的进程名。在该列中插入值时,我希望确保数据库中存在该名称的存储过程

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)
但这会产生以下错误

此字段中不允许子查询 上下文只能使用标量表达式 允许

如何执行此操作。

允许使用以下功能:

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);
允许使用以下功能:

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);

请注意,只有在插入或更新记录时,才能保证此类约束为真。该进程可以被删除而不会产生任何后果。您可能需要添加一个DDL触发器来捕获在表中有引用的被丢弃的内容和/或一个定期运行的异常报告过程来监视系统的运行状况,以确保表中的任何过程都实际存在。

请注意,这种类型的约束仅保证在记录时为真已插入或更新。该进程可以被删除而不会产生任何后果。您可能需要添加一个DDL触发器来捕获表中有引用的被丢弃的内容和/或一个定期运行的异常报告过程来监视系统的运行状况,以确保表中的任何过程实际存在。

如果您发布代码或XML,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码”按钮(101 010),以很好地格式化和语法突出显示它!作为旁注:我将使用
sys.procedures
而不是
sys.sysobjects
——首先,您的操作更清晰,其次,您不必定义要检查的对象类型——如果发布代码或XML,这显然是您正在寻找的过程,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码”按钮(101 010),以很好地格式化和语法突出显示它!作为旁注:我将使用
sys.procedures
而不是
sys.sysobjects
——首先,您的操作更清晰,其次,您不必定义要检查的对象类型——很明显,这是您正在寻找的过程