1

我正在尝试将实际调用 SQL# CLR 函数 RegEx_IsMatch 的用户定义函数添加到列中,但出现此错误:

在此上下文中,用户定义的函数名称不能以数据库名称作为前缀。

但如果函数在不同的数据库中,我不知道该怎么做。

4

2 回答 2

1

您不需要在CHECK CONSTRAINT. AFTER INSERT, UPDATE触发器应该能够提供与CHECK CONSTRAINT. 如果满足(或不)满足所需条件,您只需要取消INSERTor操作。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;
于 2015-08-15T20:32:28.450 回答
0

从未尝试过,但也许您可以在同一个数据库中创建一个辅助函数,然后调用另一个数据库?

然而,这可能会失败,因为检查约束应该是确定性的 AFAIR,并且对其他数据库的调用不是确定性的。一般来说,调用另一个数据库似乎不是一个好主意,即使它只是用于正则表达式检查。为什么不将 CLR 程序集也添加到该数据库中呢?

于 2012-01-01T22:57:37.987 回答