【问题标题】:adding a constraint that checks existence of stored proc添加一个检查存储过程是否存在的约束
【发布时间】:2010-11-18 06:47:23
【问题描述】:

我正在使用 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)

但这会产生以下错误

这里不允许子查询 语境。只有标量表达式是 允许。

我该怎么做。

【问题讨论】:

  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
  • 附带说明:我会使用 sys.procedures 而不是 sys.sysobjects - 首先,您所做的更清楚,其次,您不必定义对象类型来检查 - 很明显这是您正在寻找的程序

标签: sql-server database constraints


【解决方案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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2021-11-11
      • 2011-08-08
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多