【发布时间】:2016-07-24 19:13:54
【问题描述】:
我在 SQL 中有一个名为 EmpLog 的表,其中包含员工的“开始”和“结束”数据。我对如何在更新期间更改触发器中的变量感到非常困惑,因为它必须迎合所有不同的员工。对于每次插入,我是否需要通过 c# 中的 sql 参数更改触发器?还是有其他方法可以保持最小和高效?先感谢您。因为据我所知,触发器是硬编码到数据库中的,可以通过“ALTER”进行更改。如何通过触发器更改具有不同 ID 的现有行?
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 TotalMinutes=@totalminutes/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' WHERE EmpID = 1 和 CONVERT(date, LogDate) = CONVERT(date, GETDATE())
【问题讨论】:
-
你能具体说明问题是什么吗?
-
很抱歉不清楚,我不熟悉 SQL。我无法理解我将如何使用具有不同“WHERE”变量的触发器的逻辑,因为据我所知它是硬编码到数据库中的。
-
您不能将参数传递给触发器。您可以使用存储过程来做到这一点。如果您的逻辑很复杂,而您的逻辑似乎很复杂,那么应该使用存储过程。触发器用于在插入、更新或删除数据时必须运行的轻量级操作,例如更新用户 ID 和记录上的更新日期。您的
TotalMinutes字段甚至可以用于表格上的计算字段。 -
我不同意。触发器可能非常复杂。您可以在触发器中执行任何操作。它只是一个存储过程,其中包含一个隐式可用的受影响行的虚拟表。此外,它提供了回滚数据操作的可能性。不要改变触发器。在绑定器中使用一个逻辑,该逻辑会考虑多种场景。
-
@Massimiliano Carosi 您如何建议我让触发器使用不同的变量?
标签: c# sql-server triggers sql-insert