У меня есть таблица A
(id int, domain nvarchar, status nvarchar
) и триггер A_trigger
после вставки в таблицу A. Триггер вызывает хранимую процедуру и в зависимости от результата процедуры обновляет статус во вновь вставленной строке.
Когда я запускаю его в два сеанса, у меня возникает проблема с тупиком:
Уровень изоляции: чтение совершено
INSERT
заявление:
INSERT INTO dbo.TEST_TRIGGER (DOMAIN)
VALUES ('toto')
Курок:
CREATE TRIGGER dbo.dim_trigger
ON db.dbo.TEST_TRIGGER
AFTER INSERT
AS
DECLARE @status nvarchar(200),
@domain nvarchar(200),
@trackingId int
BEGIN
SET NOCOUNT ON;
-- This code assumes we insert one and only one row at a time.
SELECT @trackingId = id, @domain = domain FROM INSERTED;
DECLARE @toCallProcName NVARCHAR(200);
SET @toCallProcName = 'db.dbo.'+@domain+'_proc';
EXEC @toCallProcName @status out;
UPDATE db.dbo.TEST_TRIGGER
SET status = @status
WHERE id = @trackingId;
END
Я попытался:
- выполните оператор обновления с
WITH (UPDLOCK)
, но это не работает - Создание индекса для (ID) работает, но меня беспокоит это решение !!
РЕДАКТИРОВАТЬ1:
Схема таблицы:
CREATE TABLE [dbo].[TEST_TRIGGER]
(
[DOMAIN] [NVARCHAR](200) NOT NULL,
[ID] [BIGINT] IDENTITY(1,1) NOT NULL,
[STATUS] [NVARCHAR](100) NULL
)
Хранимая процедура:
CREATE PROCEDURE [dbo].[toto_proc]
@res NVARCHAR(200) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
WAITFOR DELAY '00:00:5'
PRINT 'This is me: '+CONVERT(VARCHAR(8), GETDATE(), 108) ;
SET @res = 'OK'
END
Любая помощь?
Спасибо
INSERT
, который заставляет этот триггер срабатывать, вставляет 25 строк, вы получите срабатывание триггера один раз, и псевдотаблицаInserted
будет содержать 25 рядов. Какую из этих 25 строк ваш код выберет изInserted
? Это недетерминировано, вы получите одну произвольную строку, и вы будете игнорировать все остальные строки. Чтобы учесть это, вам нужно переписать свой триггер! - person marc_s   schedule 07.08.2018