SQL#CLR関数RegEx_IsMatchを実際に呼び出すユーザー定義関数を列に追加しようとしていますが、次のエラーが発生します。
このコンテキストでは、ユーザー定義の関数名の前にデータベース名を付けることはできません。
しかし、関数が別のデータベースにある場合、これを行う方法がわかりません。
SQL#CLR関数RegEx_IsMatchを実際に呼び出すユーザー定義関数を列に追加しようとしていますが、次のエラーが発生します。
このコンテキストでは、ユーザー定義の関数名の前にデータベース名を付けることはできません。
しかし、関数が別のデータベースにある場合、これを行う方法がわかりません。
でこれを行う必要はありませんCHECK CONSTRAINT
。トリガーは、AFTER INSERT, UPDATE
と同じ機能を提供できる必要がありますCHECK CONSTRAINT
。必要な条件が満たされている (または満たされていない) 場合は、 INSERT
or操作をキャンセルするだけです。これは、DML ステートメント自体であるトランザクション内にトリガーが存在するために機能する をUPDATE
発行するだけで簡単に実行できます。ROLLBACK
したがって、次の行に沿って何かを行うだけです。
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 アセンブリを追加してみませんか?