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 INSERTUPDATEDELETEトリガーは機能しますが、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_Dateしたことに注意してください。これを 2 つの別々の列に分割する正当な理由はないようです。これにより、比較も簡単になります。time_todatetime2EndDate

私はまた、単に比較することを選択しましたgetutcdate()-あなたの現在のコードは、UTCまたは現地の日付である可能性のある値の混合に対処しようとしているようです(やや悪い)-しかし、それはまともな仕事をしません-だから防止してくださいそれはそもそも問題であり、テーブルには1種類の日時値のみを保存します。

于 2012-08-01T06:48:27.330 に答える
3

これは不可能です。それが不可能であるだけでなく、たとえそれがあったとしても、それはおそらく良い考えではありません. テーブルは生の情報源であるべきです。抽象化は、探している機能を取得するために、ビュー、テーブル値関数などの形式にする必要があります。

于 2012-08-01T06:02:11.227 に答える