USE admin_gorace
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'trScheduler_Status_Update' AND type = 'TR')
DROP TRIGGER trScheduler_Status_Update
GO
CREATE TRIGGER trScheduler_Status_Update
ON [Client].[Scheduler]
FOR INSERT, UPDATE, DELETE , SELECT
AS
UPDATE [Client].[Scheduler] set [Status]='Over'
where (Convert(varchar,[Scheduler_Date],101) <=Convert(varchar,getutcdate(),101) or Convert(varchar,[Scheduler_Date],101) <= Convert(varchar,getdate(),101))
and (right(CONVERT( varchar, [time_to], 100),7)<= right(CONVERT( varchar, getutcdate(), 100),7) or right(CONVERT( varchar, [time_to], 100),7) <= right(CONVERT( varchar, getdate(), 100),7))
and [Status]!='Cancelled' and [Status]!='Over'
GO
在INSERT
,UPDATE
,DELETE
触发器可以工作但是如何让它在select语句之前或之前工作
答案 0 :(得分:5)
你不能,Documentation说:
触发器是一种特殊的存储过程,可以自动执行 在数据库服务器中发生事件时执行。 DML触发器 当用户通过数据操作尝试修改数据时执行 语言(DML)事件。 DML事件是INSERT,UPDATE或DELETE 表或视图上的陈述。
答案 1 :(得分:4)
您设置表格的方式似乎存在许多问题。希望你可以改变它们。而不是你当前的设置,以及你试图用触发器做什么,我有:
create table Scheduler (
/* Columns - don't know what */
EndDate datetime2 not null,
CancelledAt datetime2 null,
Status as CASE
WHEN CancelledAt is not null THEN 'Cancelled'
WHEN EndDate < getutcdate() THEN 'Over'
ELSE 'Current' END
)
现在,Status
列始终是正确的,而不必对表执行手动更新 - 您只需查询它即可。请注意,我已将Scheduler_Date
和time_to
合并到一个名为datetime2
的{{1}}列中 - 似乎没有充分的理由将其拆分为两个单独的列。这也使得比较更简单。
我还选择仅基于EndDate
进行比较 - 您当前的代码似乎正在尝试(有点糟糕)处理可能是UTC或本地日期的混合值 - 但不会这样做这是一个不错的工作 - 所以首先要防止它成为一个问题,并且只在表格中存储一种类型的日期时间值。
答案 2 :(得分:2)
这是不可能的。它不仅不可能,即使它可能不是一个好主意。表应该是原始信息来源。抽象应采用视图,表值函数等形式,以获得您正在寻找的功能。