SQL: триггер не работает - PullRequest
       1

SQL: триггер не работает

0 голосов
/ 29 апреля 2011

Я создал триггер для установки значения столбца времени типа данных равным нулю, когда время вставки меньше GETDATE ()

ALTER trigger [dbo].[NULL_TIME_TRIGGER]
  on [dbo].[Products]
  after insert
  as
  update Products
  set ParkingStartTime = NULL
  from Products
   join inserted i
     on i.ParkingStartTime  = Products.ParkingStartTime 
  where i.ParkingStartTime < CAST(GETDATE() AS TIME);

Проблема заключается в том, что когда I select * From tableзапись все еще имеет время, а не NULL.

Любые идеи?

С уважением.

Ответы [ 4 ]

1 голос
/ 29 апреля 2011

В конце концов, вам нужно задание sql, которое просто просматривает и устанавливает нулевое время, когда критерии времени меньше getDate ()

0 голосов
/ 29 апреля 2011

У меня есть идея, да. Когда строка вставлена, значение времени больше текущего времени, поэтому оно остается нетронутым. Когда вы проверяете содержимое таблицы, некоторые значения уже превышают текущее время на момент проверки.

0 голосов
/ 29 апреля 2011

у рсенны есть один вариант, и он превосходит во многих отношениях. Вот как я бы сыграл вашу версию AFTER INSERT (предположим, что int как PK):

ALTER trigger [dbo].[NULL_TIME_TRIGGER]       
ON [dbo].[Products]       
AFTER INSERT       
AS

DECLARE @ID int

SELECT @ID = ID FROM INSERTED

UPDATE Products
SET ParkingStartTime = NULL
WHERE ID = @ID
0 голосов
/ 29 апреля 2011

Я искренне не знаю, что не так с вашим триггером, он должен работать AFAIK.

Но это определенно не путь. Вы , кажется пытаетесь проверить некоторые вставленные значения. В этом случае вы должны использовать INSTEAD OF INSERT триггер, а не AFTER INSERT, как вы это делаете в настоящее время.

Так было бы так:

ALTER trigger [dbo].[NULL_TIME_TRIGGER]
  on [dbo].[Products]
  instead of insert
  as
  begin
      insert into Products (
          field1, field2, ..., fieldn, ParkingStartTime
      ) select
          field1, field2, ..., fieldn,
          case when ParkingStartTime < CAST(GETDATE() AS TIME) then NULL else ParkingStartTime end
      from
          inserted
  end
  go

Таким образом, SQL Server будет перехватывать все вставки в таблицу Products и будет выполнять вставку только внутри триггера, который фиксирует значение ParkingStartTime. Таким образом, триггеру не нужно выполнять другое обновление, чтобы сделать их правильными.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...