Как реализовать это в Transact SQL (SQL Server 2008) - PullRequest
0 голосов
/ 08 июня 2010

Я просто хочу триггер обновления, подобный этой версии postgresql ... Мне кажется, что нет NEW. и СТАРЫЙ в MSSQL?

CREATE OR REPLACE FUNCTION "public"."ts_create" () RETURNS trigger AS
DECLARE
BEGIN
  NEW.ctime := now();
  RETURN NEW;
END;

Уже гуглил, но, к сожалению, ничего не найдено ... Идеи?

Обновление: Sth, как это?

CREATE TRIGGER tr01 ON Auctions for insert
As
update auctions set mtime = GETDATE() where Id = inserted.Id;

или это:

CREATE TRIGGER tr01 ON Auctions for insert
As
inserted.ctime := GETDATE();

оба не работают, конечно;)

Ответы [ 3 ]

4 голосов
/ 08 июня 2010

В SQL Server псевдотаблицы называются INSERTED и UPDATED .

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

CREATE TRIGGER schema.tbl_name_insert ON schema.tbl_name
    AFTER INSERT
    AS
        SET NOCOUNT ON

        UPDATE schema.tbl_name
        SET mtime = getdate()
        FROM schema.tbl_name
        INNER JOIN JOIN INSERTED
            ON schema.tbl_name.PK = INSERTED.PK

или

CREATE TRIGGER schema.tbl_name_insert ON schema.tbl_name
    AFTER INSERT
    AS
        SET NOCOUNT ON

        UPDATE schema.tbl_name
        SET mtime = getdate()
        FROM schema.tbl_name
        WHERE schema.tbl_name.PK IN (SELECT PK FROM INSERTED)

Триггер срабатывает один раз для всего оператора INSERT, поэтому, как правило, таблицы INSERT AND DELETED могут содержать несколько строк.

3 голосов
/ 08 июня 2010

Для триггеров SQL делает доступными виртуальные таблицы с именами «вставлен» и «удален». Вот примерный триггер, который я использовал в течение нескольких месяцев (SQL 2005):

CREATE TRIGGER [MAP].[TR_iu_MyTable__LastUpdated]
 on [dbo].[MyTable]
 after insert, update

AS

    SET NOCOUNT on

    UPDATE MAP.MyTable
     set LastUpdated = getdate()
     where MyTableId in (select MyTableId from inserted)

GO

(Обратите внимание, что это триггер "после", поэтому мне нужно только выполнить ОБНОВЛЕНИЕ.)

1 голос
/ 08 июня 2010

Во-первых, для вставки вы можете установить значение по умолчанию GETDATE ().

Затем при обновлении попробуйте что-то вроде этого:

CREATE TRIGGER TimeUpdater ON Auctions FOR UPDATE
AS
UPDATE auctions 
SET mtime = GETDATE() 
FROM UPDATED u
WHERE Id = u.Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...