2016-07-24 6 views
0

EmpLogという名前のテーブルに従業員の「開始」と「終了」データが含まれています。すべての異なる従業員に対応しなければならないので、私は更新中にトリガー内の変数をどのように変更するのかについてはかなり混乱しています。挿入するたびに、C#でSQLパラメータを使用してトリガを変更する必要がありますか?またはそれを最小限かつ効率的に保つための代替手段がありますか?前もって感謝します。私が知ることができる限り、トリガーはデータベースにハードコードされており、これは 'ALTER'によって変更可能です。トリガによって、異なるIDを持つ既存の行を変更するにはどうすればよいですか?SQLでC#を使用してトリガを使用して既存の行を更新する方法

create trigger TrgEmpLog on EmpLog 
AFTER UPDATE 
AS 
declare @shiftstart time; 
declare @shiftend time; 
declare @totalminutes decimal(18,2); 

IF EXISTS (SELECT shiftend FROM EmpLog WHERE EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and shiftend is not null) 
    BEGIN 
     IF EXISTS (SELECT EmpLog.TotalMinutes from EmpLog WHERE EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes is not null) 
      BEGIN 
       ROLLBACK TRANSACTION 
      END 
       ELSE 
       select @shiftstart=EmpLog.ShiftStart from EmpLog where EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes IS NULL; 
       select @shiftend=EmpLog.ShiftEnd from EmpLog where EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes IS NULL;  
       select @totalminutes=DATEDIFF(MINUTE,@shiftstart, @shiftend); 
       UPDATE EmpLog 
       SET [email protected]/60.00 
       WHERE EmpID= "C# Variable"and CONVERT(date,LogDate) = CONVERT(date, GETDATE()); 
    END 
     ELSE 
      BEGIN 
       ROLLBACK TRANSACTION 
      END 

そして、私はトリガー入力を求めるように使用しているコードは次のとおりです。

UPDATE EmpLog 
SET ShiftEnd = 'current time' 
WHERE EmpID='C# variable' and CONVERT(date,LogDate) = CONVERT(date, GETDATE()); 

このコードは、以下のトリガーで終わるが、私は削除した場合、それは動作します「とLOGDATE = GETDATE() 。 UPDATE EmpLog SET ShiftEnd = '09:00:00 'EmpID = 1とCONVERT(date、LogDate)= CONVERT(日付、GETDATE())

+0

問題の内容を正確に明確にすることはできますか? – Danieboy

+0

不明な点をおかけして申し訳ありませんが、私はSQLに慣れていません。私は、データベースにハードコードされている限り、どのように異なる 'WHERE'変数でトリガーを利用できるようになるのかという論理を理解できません。 – user3442765

+0

トリガーにパラメータを渡すことはできません。あなたはストアドプロシージャでそれを行うことができます。あなたのロジックが複雑で、あなたのロジックがそうであると思われる場合は、ストアドプロシージャが必要です。トリガーは、ユーザーIDおよびレコードの更新日の更新など、データの挿入、更新、または削除時に実行する必要のある軽量操作を目的としています。あなたの 'TotalMinutes'フィールドは、テーブル上の計算されたフィールドにも役立ちます。 –

答えて

1

このコードは、たぶんそれはあなたが必要とするもののために働くでしょう。実際のトリガー部分は、おそらくあなたが本当に必要とするもので、残りの部分はテストに使用したものです。

これが書き込まれる方法では、現在の関連するレコード(その時点で更新されているレコード)のみが更新されます。 insertedテーブルに参加すると、そのことが確実に行われます。 Use the inserted and deleted Tables (MSDN)

CREATE TABLE EmpLog (EmpID int, ShiftStart time, Shiftend time, LogDate date, TotalMinutes decimal(18,2)); 
GO 

-- Trigger starts here 
CREATE TRIGGER TrgEmpLog ON EmpLog 
AFTER UPDATE 
AS 

IF EXISTS (SELECT * 
    FROM EmpLog A JOIN inserted B 
    ON A.EmpID = B.EmpID 
    WHERE CONVERT(date, A.LogDate) = CONVERT(date, GETDATE()) 
     AND A.shiftend IS NOT NULL) 
BEGIN 
    IF EXISTS (SELECT * 
      FROM EmpLog A JOIN inserted B 
      ON A.EmpID = B.EmpID   
      WHERE CONVERT(date, A.LogDate) = CONVERT(date, GETDATE()) 
      AND A.TotalMinutes IS NOT NULL) 
     BEGIN 
      ROLLBACK TRANSACTION 
     END 
      UPDATE EmpLog 
      SET TotalMinutes=DATEDIFF(MINUTE, A.ShiftStart, A.Shiftend)/60.00 
      FROM EmpLog A JOIN inserted B 
      ON A.EmpID = B.EmpID; 
END 
ELSE 
BEGIN 
    ROLLBACK TRANSACTION 
END 

GO 
-- Trigger End here 

INSERT INTO EmpLog (EmpID, ShiftStart, Shiftend, LogDate) VALUES (1, '00:00:00', NULL, GETDATE()), 
    (2, '08:00:00', NULL, GETDATE()), 
    (3, '16:00:00', NULL, GETDATE()); 

SELECT * FROM EmpLog; 

UPDATE EmpLog SET Shiftend = '08:00:00' WHERE EmpID = 1; 

SELECT * FROM EmpLog; 

DROP TABLE EmpLog; 

彼らは正確にあなたのロジックに従わない場合は、IF EXISTSのいくつかで遊んでする必要があります。

@massimilianoはコメントの中で述べたように、トリガーは望むなら非常に複雑になります。私にとって、私はそれを避けます。トリガは、問題をトラブルシューティングする際に常に考えている最後の場所の1つです。個人の好み!

Good Luck!

+0

ありがとうございました!私はあなたのコードを勉強します!私は有望だ! – user3442765

+0

WHEREに「LogDate」を追加すると、「トランザクションがトリガーで終了しました。バッチが中止されました」という理由が不思議に思えますが、 – user3442765

+0

これから 'ROLLBACK TRANSACTION'文を削除すると思います。私はあなたがそれらを維持する理由があるかもしれないと思ったので、私はそれらを残しました。トリガーは、書かれているように、 'IF EXISTS'基準が満たされている場合にのみ更新を行います。そうでない場合は、何もロールバックする必要はありません。 –

関連する問題