триггер и транзакции на временных таблицах - PullRequest
1 голос
/ 14 марта 2011

можем ли мы создать триггер и транзакции для временных таблиц?

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

и когда служба SQL остановится или сервер будет остановлен, временные таблицы будут удалены автоматически.

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

Ответы [ 3 ]

6 голосов
/ 14 марта 2011

Не думаю, что вы понимаете триггеры - срабатывание триггера связано с оператором, с которым они связаны, а не с фиксацией транзакции. Два сценария:

Сценарий 1:

create table T1 (
    ID int not null,
    Val1 varchar(10) not null
)
go
create table T2 (
    ID int not null,
    Val2 varchar(10) not null
)
go
create trigger T_T1_I
on T1
after insert
as
    insert into T2 (ID,Val2) select ID,Val1 from inserted
go
begin transaction
insert into T1 (ID,Val1)
select 10,'abc'
go
RAISERROR('Run script 2 now',10,1) WITH NOWAIT
WAITFOR DELAY '00:01:00'
go
commit

Сценарий 2:

select * from T2 with (nolock)

Откройте два соединения с одной и той же БД, вставьте один скрипт в каждое соединение. Запуск сценария 1. Когда отобразится сообщение «Выполнить сценарий 2 сейчас», переключитесь на другое соединение. Вы увидите, что вы можете выбрать незафиксированные данные из T2, даже если эти данные вставляются триггером. (Это также подразумевает, что соответствующие блокировки удерживаются на T2 сценарием 1, пока не сработает триггер).


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

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

2 голосов
/ 14 марта 2011

Триггеры не могут быть созданы для временных таблиц. Но это необычное требование.

Временные таблицы могут быть частью транзакции, но табличные переменные не могут.

Как указывает @Damien, триггеры НЕ запускаются при совершении транзакции, а запускаются при действии на таблицу (INSERT, UPDATE, DELETE) с соответствующим триггером.

1 голос
/ 17 июня 2013

Или создайте представление, в которое вы можете вставить данные.Он запишет обратно в таблицу, а затем сработают триггеры.

...