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())
문제의 원인을 정확히 확인할 수 있습니까? – Danieboy
불분명해서 죄송합니다. SQL에 익숙하지 않습니다. 나는 내가 이해할 수있는만큼 다른 변수가있는 트리거를 활용할 수있는 논리를 이해할 수 없다. – user3442765
* 매개 변수를 트리거에 전달할 수 없습니다. 저장 프로 시저로 그렇게 할 수 있습니다. 논리가 복잡하고 귀하의 논리가 그렇다면 저장 프로 시저가 있어야합니다. 트리거는 레코드의 사용자 ID 및 갱신 된 날짜 갱신과 같이 데이터가 삽입, 갱신 또는 삭제 될 때 실행해야하는 더 가벼운 연산을위한 것입니다. 'TotalMinutes' 필드는 테이블의 계산 된 필드에 빌려주기도합니다. –