3
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'

On INSERT, UPDATE, DELETEtrigger 可以工作 但是如何让它在 select 语句上或之前工作

4

3 回答 3

6

你不能,文档说:

触发器是一种特殊的存储过程,当数据库服务器中发生事件时会自动执行。DML 触发器在用户尝试通过数据操作语言 (DML) 事件修改数据时执行。DML 事件是表或视图上的 INSERT、UPDATE 或 DELETE 语句。

于 2012-08-01T06:04:28.943 回答
5

您设置表格的方式似乎存在许多问题。希望你能改变它们。而不是您当前的设置,以及您尝试使用触发器执行的操作,我将拥有:

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_Datetime_to一个datetime2名为的列EndDate- 似乎没有充分的理由将其拆分为两个单独的列。这也使比较更简单。

我还选择仅根据getutcdate()- 您当前的代码似乎正在尝试(有些糟糕)来处理可能是 UTC 或本地日期的混合值 - 但不会做得很好 - 所以防止这首先是一个问题,并且只在表中存储一种类型的日期时间值。

于 2012-08-01T06:48:27.330 回答
3

这是不可能的。这不仅是不可能的,即使它可能不是一个好主意。表格应该是信息的原始来源。抽象应该以视图、表值函数等的形式来获得您正在寻找的功能。

于 2012-08-01T06:02:11.227 回答