2017-04-18 10 views
2

トリガーは非常に新しいので、私の周りに頭を包んでいるようには見えません。 id = 1を持つ唯一の1つのプロジェクトがありますと仮定SQL Serverの日付を比較するトリガーを作成する

INSERT INTO Project VALUES ('2017-04-18', '2017-05-01'); /*id = 1*/ 
INSERT INTO Work VALUES ('2017-04-17', 1); 

、これはうまく行くはずです。私はいくつかのデータを挿入

CREATE TABLE Project 
(
    id INT NOT NULL IDENTITY(1, 1), 
    startDate DATETIME, 
    endDate DATETIME 
); 

CREATE TABLE Work 
(
    date DATETIME, 
    projectId INT 
); 

:のは、私はここに2つのテーブルを持っていると仮定しましょう。しかし、私の仕事は、プロジェクトが始まる前の日(この場合ではなく)に始まることはあまり意味がありません。基本的にdate cannot be < startDate OR > endDateというトリガーを作成するにはどうすればよいですか?

+1

あなたはすべきですデータベースレイヤではなく、アプリケーションレイヤでビジネスルールを処理します。 @WEI_DBA私が知っているのは –

+0

です。これはまったく仕事に関係するものではなく、実際のアプリケーションでこれを行うことは決してありません。 – MortenMoulder

+0

Then ... 'Work'テーブルに' Insert Trigger'の代わりに 'を使います。 –

答えて

2

このような何かが動作するはずです:

あなたのケースでは
CREATE TRIGGER t_CheckInterval ON dbo.Work 
    AFTER UPDATE, INSERT 
AS 

IF NOT EXISTS (
    --if no records are returned then work date lies outside the project 
    -- (start, end) interval 
    SELECT 1 
    FROM inserted AS i 
    JOIN Project AS p 
     ON p.Id = i.projectId AND i.[date] BETWEEN p.startDate AND p.endDate 
) 
BEGIN 
    RAISERROR ('Error: Your error message here.', 16, 1) 
    ROLLBACK TRANSACTION 
END 

GO 
+0

完璧に動作します!どうもありがとう。今より多くの意味を作りましょう。私はJOINの部分を完全に欠いていました。 – MortenMoulder

1

代わりcheckingsこれらの種類のトリガを使用するので、私はチェック制約を使用することをお勧め、このような何か:

CREATE FUNCTION dbo.ufn_CheckWorkDate 
(
    @WorkDate DateTime, 
    @ProjectID INT 
) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @Result BIT 

    IF EXISTS (SELECT * FROM Project WHERE id = @ProjectID AND @WorkDate BETWEEN startdate AND endDate) 
     SET @Result = 1 
    ELSE 
     SET @Result = 0 

    RETURN @Result 
END 

GO 

ALTER TABLE Work 
    WITH CHECK ADD CONSTRAINT CK_CheckWorkDate 
    CHECK (dbo.ufn_CheckWorkDate(date, projectid) = 1) 
+0

はい、トリガー以外のもの(CONSTRAINTのようなもの)を使っているのは確かにはるかに優れています。ありがとう。 – MortenMoulder