【问题标题】: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 的用户定义函数添加到列中,但出现此错误:

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

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

【问题讨论】:

    标签: sql-server-2008 user-defined-functions sqlclr check-constraints


    【解决方案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 程序集也添加到此数据库中?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多