1

実際に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; 
0

これは試したことはありませんが、別のDBを呼び出す同じDB内にヘルパー関数を作成できますか?

これは、チェック制約が決定的AFAIRであると考えられ、他のデータベースへの呼び出しが確定的でないために失敗することがあります。一般的に、たとえそれが正規表現チェック用であったとしても、別のDBを呼び出すのは良い考えのようには思えません。なぜこのDBにCLRアセンブリを追加しないのですか?

関連する問題