2016-07-24 5 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에 익숙하지 않습니다. 나는 내가 이해할 수있는만큼 다른 변수가있는 트리거를 활용할 수있는 논리를 이해할 수 없다. – 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가 주석에서 언급했듯이, 원하는 경우 트리거가 상당히 복잡 할 수 있습니다. 나를 위해, 나는 그것을 피한다. 트리거는 항상 문제를 해결할 때 볼 수있는 마지막 장소 중 하나입니다. 개인의 취향!

행운을 빌어 요!

+0

정말 고마워요 !! 나는 당신의 코드를 연구 할 것이다! 나는 희망이있다! – user3442765

+0

"LogDate"를 WHERE에 추가하면 "트랜잭션이 트리거로 끝났습니다. 일괄 처리가 중단되었습니다"라는 이유가 궁금합니다. 원래 게시판에 편집 할 것입니다. – user3442765

+0

여기에서'ROLLBACK TRANSACTION' 문을 제거하는 방법을 생각해보십시오. 나는 네가 그들을 지킬 이유가 있다고 생각했기 때문에 그들을 버렸다.기록 된대로 방아쇠는'IF EXISTS' 기준이 충족되면 업데이트 만 수행하므로 그렇지 않은 경우 다시 롤백 할 필요가 없습니다. –

관련 문제