我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:
在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。
但如果函数在不同的数据库中,我不知道该怎么做。
我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:
在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。
但如果函数在不同的数据库中,我不知道该怎么做。
您不需要在CHECK CONSTRAINT
. AFTER INSERT, UPDATE
触发器应该能够提供与CHECK CONSTRAINT
. 如果满足(或不)满足所需条件,您只需要取消INSERT
or操作。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;
从未尝试过,但也许您可以在同一个数据库中创建一个辅助函数,然后调用另一个数据库?
然而,这可能会失败,因为检查约束应该是确定性的 AFAIR,并且对其他数据库的调用不是确定性的。一般来说,调用另一个数据库似乎不是一个好主意,即使它只是用于正则表达式检查。为什么不将 CLR 程序集也添加到该数据库中呢?