我正在使用SQL Server 2005,在其中一个表中,我有一个存储proc名称的列。在该列中插入值时,我想确保数据库中存在该名称的存储过程。
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)
但这会产生以下错误
此处不允许使用子查询 上下文。只有标量表达式 允许的。
我该怎么办呢。
答案 0 :(得分:4)
允许使用的功能:
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);
答案 1 :(得分:2)
请注意,此类约束仅在插入或更新记录时保证为true。可以放弃proc而不会产生任何后果。您可能需要添加一个DDL触发器来捕获丢弃的内容,这些内容在表中有引用和/或异常报告过程,该过程定期运行以监视系统的运行状况以确保表中的任何过程实际存在。