実際にSQL#CLR関数RegEx_IsMatchを列に呼び出すユーザー定義関数を追加しようとしていますが、このエラーが発生します。異なるデータベースのユーザー定義関数を呼び出す検査制約を追加できますか?
ユーザー定義関数名の先頭にデータベース名を付けることはできませんコンテキスト。
しかし、関数が別のデータベースにある場合、私はこれを行う方法がわかりません。
実際にSQL#CLR関数RegEx_IsMatchを列に呼び出すユーザー定義関数を追加しようとしていますが、このエラーが発生します。異なるデータベースのユーザー定義関数を呼び出す検査制約を追加できますか?
ユーザー定義関数名の先頭にデータベース名を付けることはできませんコンテキスト。
しかし、関数が別のデータベースにある場合、私はこれを行う方法がわかりません。
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;
これは試したことはありませんが、別のDBを呼び出す同じDB内にヘルパー関数を作成できますか?
これは、チェック制約が決定的AFAIRであると考えられ、他のデータベースへの呼び出しが確定的でないために失敗することがあります。一般的に、たとえそれが正規表現チェック用であったとしても、別のDBを呼び出すのは良い考えのようには思えません。なぜこのDBにCLRアセンブリを追加しないのですか?