Нужна помощь с Sql Server и простым триггером - PullRequest
2 голосов
/ 02 июня 2009

Я хочу сделать триггер, но я не уверен, как получить данные для того, что вызвало триггер.

У меня есть таблица simlpe.

FooId INT PK NOT NULL IDENTITY
Name VARCHAR(100) NOT NULL

Я хочу иметь триггер, чтобы при появлении ОБНОВЛЕНИЯ, ВСТАВКИ или УДАЛЕНИЯ я затем делал следующее.

Pseduocode

IF INSERT
    Print 'Insert' & Name
ELSE IF UPDATE
    Print 'Update' & FooId & Name
ELSE IF DELETE
    Print 'Delete' & FooId & Name

Теперь я знаю, как сделать триггер для таблицы. Что я не знаю, как это сделать, так это выяснить значения на основе типа триггера.

Может кто-нибудь помочь?

Редактировать: Не уверен, что это помогает, но БД Sql Server 2008

Ответы [ 4 ]

4 голосов
/ 02 июня 2009

псевдо-таблица «вставлена» содержит новые данные, а «удаленная» таблица содержит старые данные.

Вы можете сделать что-то вроде

create trigger mytrigger on mytable for insert, update, delete
as
    if ( select count(*) from inserted ) > 0
        -- insert or update
        select FooId, Name from inserted
    else
        -- delete
        select FooId, Name from deleted

Для уточнения всех комментариев, сделанных другими, на вставке таблица вставка содержит данные, а удалено пусто. При удалении ситуация меняется на противоположную. При обновлении удаленные и вставленные содержат копии «до» и «после» любых обновленных строк.

1 голос
/ 02 июня 2009

Когда вы пишете триггер, вы должны учитывать тот факт, что ваш триггер может быть вызван оператором, который воздействует более чем на одну строку одновременно.

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

0 голосов
/ 02 июня 2009

В 2008 году также есть команда MERGE. Как вы хотите справиться с этим?

Начиная с 2008 года, есть четыре команды, которые вы можете изменить в таблице: INSERT, UPDATE, DELETE и MERGE:

http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

http://sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/11/reasons-to-move-to-sql-2008-merge.aspx

Что вы хотите, чтобы ваш триггер делал, когда кто-то запускает команду MERGE для вашей таблицы?

0 голосов
/ 02 июня 2009

Триггеры SQL предоставляют неявно определенную таблицу, которая называется «вставлена», которая возвращает затронутые строки, что позволяет вам выполнять такие действия, как

UPDATE mytable SET mytimestamp = GETDATE() WHERE id IN (SELECT id FROM inserted)

Что касается примера кода, вам нужно создать отдельные триггеры INSERT, UPDATE и DELETE, если вы выполняете отдельные действия для каждого из них.

(По крайней мере, так обстоит дело в SQL Server ... вы не указали платформу.)

...