如何在SQL Server 2008上或之前选择创建触发器(How to Create Trigge

2019-09-20 14:15发布

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'

INSERTUPDATEDELETE触发器可以工作,但如何让它工作或SELECT语句前

Answer 1:

你不能, 文件说:

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



Answer 2:

似乎有一些与你建立你的表的方式的问题。 希望你可以改变它们。 相反,当前的设置,你试图用一个触发做什么的,我有:

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或当地日期-但不会做一个体面的工作 - 所以防止它被摆在首位的问题,只存储一个类型的日期时间值的表。



Answer 3:

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



文章来源: How to Create Trigger on or Before Select in SQL Server 2008