SQL Server: ошибка при запуске триггера вставки для обновления - PullRequest
0 голосов
/ 24 июля 2011

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

Мой запрос и ошибка триггера и вставки:

Trigger:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [unique_outmsg_id] 
ON [dbo].[tbl_subscription]
FOR  INSERT
AS
BEGIN
  DECLARE @random_number varchar(6);
  DECLARE @time_value varchar(23);
  DECLARE @unique_id varchar(20);
  SELECT  @random_number = convert(varchar,(SELECT CAST(RAND() * 999 AS INT)));
  SELECT  @time_value =  convert(varchar,(select replace(replace(replace(replace(convert(varchar(23), getdate(), 121),'-',''),'.',''),' ',''),':','')));
  SELECT  @unique_id=(SELECT(@time_value+@random_number));   
  UPDATE dbo.tbl_subscription SET outmsg_id=@unique_id WHERE outbox_id=(SELECT outbox_id FROM inserted)
END

Выход триггера: 20110724093323697833

Многострочный запрос вставки:

 USE [test_abc] 
 INSERT INTO [test_abc].[dbo].[tbl_subscription] (inbox_id,inmsg_id,enabled) 
 SELECT s.inbox_id,s.enabled
 FROM   [test_def].[dbo].[tbl_subscriberlist] s,[test_def].[dbo].infoservice i 
 WHERE  s.mo_key = 'ABC' AND i.subscribtionKey='ABC'

Функциональность этого запроса:

Чтобы собрать информацию из другой таблицы и вставить в tbl_subscription несколько строк.

Но ошибка возникает при выполнении этого запроса:

Сообщение 512, уровень 16, состояние 1, процедура unique_outmsg_id, строка 13 Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется как выражение. Заявление было прекращено.

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

Ответы [ 2 ]

3 голосов
/ 24 июля 2011

Триггеры должны быть записаны для обработки нескольких строк.

Проблема в этом обновлении:

UPDATE dbo.tbl_subscription 
SET outmsg_id=@unique_id 
WHERE outbox_id = (SELECT outbox_id FROM inserted)

Ожидается, что подвыбор (SELECT outbox_id FROM inserted) вернет только одну строку (что, конечно, не произойдет, когда сработает триггер для многострочного пакета).

Вам необходимо переписать оператор UPDATE как объединение с таблицей inserted

1 голос
/ 24 июля 2011

Это возвращает все строки. Вы можете выбрать только 1 значение в поле

WHERE outbox_id = (SELECT outbox_id FROM inserted)

Вместо этого попробуйте (хотя я не могу проверить это)

UPDATE s
SET outmsg_id=@unique_id 
dbo.tbl_subscription s
JOIN inserted i
ON s.outbox_id=i.outbox_id

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

SELECT  @random_number = convert(varchar,(SELECT CAST(RAND() * 999 AS INT)));  

Вместо этого попробуйте:

SELECT  @random_number = convert(varchar,(CAST(RAND(ABS(CHECKSUM(NEWID())))*999 AS INT) AS INT)));  

(я узнаю часть кода Микаэля Эйриксона в вашем утверждении)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...