如何在SQL Server 2008中选择或之前创建触发器

时间:2012-08-01 05:57:36

标签: sql sql-server-2008

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

INSERTUPDATEDELETE触发器可以工作但是如何让它在select语句之前或之前工作

3 个答案:

答案 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_Datetime_to合并到一个名为datetime2的{​​{1}}列中 - 似乎没有充分的理由将其拆分为两个单独的列。这也使得比较更简单。

我还选择仅基于EndDate进行比较 - 您当前的代码似乎正在尝试(有点糟糕)处理可能是UTC或本地日期的混合值 - 但不会这样做这是一个不错的工作 - 所以首先要防止它成为一个问题,并且只在表格中存储一种类型的日期时间值。

答案 2 :(得分:2)

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