是否可以添加一个在不同数据库中调用用户定义函数的检查约束?
Posted
技术标签:
【中文标题】是否可以添加一个在不同数据库中调用用户定义函数的检查约束?【英文标题】:Is it possible to add a check constraint that calls a user defined function in a different database? 【发布时间】:2012-01-01 22:46:33 【问题描述】:我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:
在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。
但如果函数在不同的数据库中,我不知道该怎么做。
【问题讨论】:
【参考方案1】:您不需要在CHECK CONSTRAINT
中执行此操作。 AFTER INSERT, UPDATE
触发器应该能够提供与CHECK CONSTRAINT
相同的功能。如果满足(或不满足)所需条件,您只需取消INSERT
或UPDATE
操作。这很容易通过发出ROLLBACK
来完成,这是由于DML 语句本身的事务中存在触发器而起作用的。因此,只需按照以下方式做一些事情:
CREATE TRIGGER dbo.trCheckSomeField
ON dbo.SomeTable
AFTER INSERT, UPDATE
AS
SET NOCOUNT ON;
IF (EXISTS(
SELECT *
FROM Inserted ins
WHERE Utility.SQL#.RegEx_IsMatch(ins.SomeField, ...) = 0
)
)
BEGIN;
ROLLBACK TRAN;
RAISERROR('Your data suck!', 16, 1);
RETURN;
END;
【讨论】:
【参考方案2】:从未尝试过,但也许您可以在同一个数据库中创建一个辅助函数,然后调用另一个数据库?
这可能会失败,因为检查约束应该是确定性的 AFAIR,而对其他数据库的调用不是确定性的。一般来说,调用另一个数据库似乎不是一个好主意,即使它只是用于正则表达式检查。为什么不将 CLR 程序集也添加到此数据库中?
【讨论】:
以上是关于是否可以添加一个在不同数据库中调用用户定义函数的检查约束?的主要内容,如果未能解决你的问题,请参考以下文章