Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Inserted в триггере может содержать больше одной записи?  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Тут где-то наткнулся, что Inserted может содержать больше одной записи.
Разве это не конкретная запись на которую сработал триггер?
Если так, то этот код кривой или я все напутал ))?

create trigger trg_t1_i
on t1
for insert
as
begin
    insert into arch_t1 (op_id, id, f1, f2)
    select 0, id, f1, f2 from inserted
end
go
create trigger trg_t1_d
on t1
for delete
as
begin
    insert into arch_t1 (op_id, id)
    select 1, id from deleted
end
go
create trigger trg_t1_u
on t1
for update
as
begin
    insert into arch_t1 (op_id, [columns_updated], id, f1, f2)
    select 2, columns_updated(), id, f1, f2 from inserted
end
go
19 май 14, 22:57    [16039903]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vladimir_V.
Разве это не конкретная запись на которую сработал триггер?

Триггер срабатывает на событие/команду,а не на запись.


Vladimir_V.
Если так, то этот код кривой или я все напутал ))?

Предложенный код - "прямой"
Потому что работает с inserted/deleted именно как с таблицами
19 май 14, 23:07    [16039950]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
и inserted и deleted может больше 1, а то и меньше 1 - как в случае update where 0=1 - триггер все равно будет вызван
но код внешне норм, в чем вопрос-то?
19 май 14, 23:08    [16039952]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Просто увидел такой код с INNER JOIN и запутался ))

go
create trigger trg_t1_i
on t1
for insert
as
begin
    insert into arch_t1 (op_id, id, f1, f2)
    select
        0, t.id, t.f1, t.f2
    from
        inserted i
        inner join t1 t on i.id = t.id
end
go
19 май 14, 23:21    [16040011]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Не понятно зачем здесь INNER JOIN
19 май 14, 23:34    [16040060]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vladimir_V.
INNER JOIN

join-ы нужны для соединения таблиц в одном запросе
19 май 14, 23:39    [16040075]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Vladimir_V.
Member

Откуда:
Сообщений: 85
Glory, это-то как раз понятно)
20 май 14, 09:00    [16040580]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Похоже, здесь INNER JOIN помогает отслеживать вставку в таблицу t1 записей с id, которое уже есть в таблице.
Если таких нет, то в arch_t1 не вставит ничего. Если есть, то вставит существующие.
20 май 14, 10:12    [16040909]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
after insert
Guest
Jovanny
Похоже, здесь INNER JOIN помогает отслеживать вставку в таблицу t1 записей с id, которое уже есть в таблице.
Если таких нет, то в arch_t1 не вставит ничего. Если есть, то вставит существующие.

откуда такой странный вывод?

на момент выполнения триггер for insert (он же after insert) данные в таблице уже есть.

проверить не сложно

use tempdb

create table t1 (
	id int
)
go

create table arch_t1(
	id int
)
go

create trigger trg_t1_i
on t1
for insert
as
begin
    insert into arch_t1 (id)
    select
        t.id
    from
        inserted i
        inner join t1 t on i.id = t.id
end
go


insert t1
select 1


select *
from arch_t1

drop table arch_t1
drop table t1
20 май 14, 10:35    [16041046]     Ответить | Цитировать Сообщить модератору
 Re: Inserted в триггере может содержать больше одной записи?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Vladimir_V.
Не понятно зачем здесь INNER JOIN
Например, чтобы в триггере получить доступ к столбцам типа text или image.
20 май 14, 10:40    [16041082]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить