2016-10-09 7 views
0

私のデータベースには、IDが有効であるために特定のIDのリストと一致しなければならないというビジネスルールがあります。このインスタンスでCHECK制約を使用することはできません。有効なIDを見つけるためにサブクエリが必要なため、トリガーを使用する必要があります。簡単に言えばINSTEAD OF/AFTERトリガーとUDFの選択

は、テーブルAの表Aに挿入されるレコードIDフィールド(数値)ために表B又はC.

に存在しなければならない私は、しかし、確認するスカラーUDFを使用することができIDが有効であれば、これは機能の悪用のようなものです。私はこれをデータベースですでに数回やっていますが、うまくいくものの、間違っているように見えます。

トリガに戻って、エラーが異なる段階で検出される以外は、両方の機能が動作するように見えるため、この場合にどのトリガを使用する必要があるのか​​判断できません。

INSTEAD OFトリガーを使用すると、挿入/更新される前に無効なIDがキャッチされますが、このトリガーのコードは少し複雑に見えます。 (12の変数と長い扱いにくいINSERTステートメントを含む)

AFTERトリガーは同じタスクを実行しますが、行が挿入されて操作がロールバックされた後にエラーが検出されます。

これらのアプローチの3つすべてが機能しているにもかかわらず、これらのアプローチのうちの1つがタスクにとってより適切でなければなりませんか?

+0

トリガーは、一般的に、更新/削除/挿入操作に使用する、そしてあなたは、挿入する前に、有効なIDを確認したいです。 UIDまたはサブクエリを使用してチェックします(例:myidからmyidを選択した場合) begin - ビジネスロジックを end –

+0

これは私がデータベース内で前に行ったことです。それを行う一般的に受け入れられた方法。 – Jake

答えて

1

ユーザー定義関数を使用して、検証コードをカプセル化することができます。このように見えるはずです。

-- Create Dummy Table 
CREATE TABLE Employee 
(ID INT, Name VARCHAR(50), Age TINYINT) 
GO 

-- Function to verify age of employee 
CREATE FUNCTION dbo.verifyAge 
(@Age TINYINT) 
RETURNS BIT 
    BEGIN 
     IF (@Age IS NULL OR @Age >= 18) 
      RETURN 1 

     RETURN 0; 
    END; 

-- Add check constraint 
ALTER TABLE dbo.Employee 
    ADD CONSTRAINT Chk_verifyAge CHECK (dbo.verifyAge(Age) = 1) 
GO 
-- Test check Constraint 
INSERT INTO dbo.Employee 
     (ID, Name, Age) 
VALUES (1, 'Dummy',17) 
GO 

enter image description here

関連する問題