Триггеры в SQL Server - PullRequest
       0

Триггеры в SQL Server

0 голосов
/ 17 ноября 2010

Я новичок в SQL. Я читаю Триггеры создали два триггера на таблице. Ниже приведены мои триггеры -

CREATE trigger Test_TRIGGER_FOR
ON TEST_TABLE
for Insert
AS
if((Select ID from TEST_TABLE) =( Select ID from INSERTED))
BEGIN
PRINT 'you have successful using FOR'
END
ELSE
BEGIN
PRINT 'ERROR AFTER'
END

CREATE trigger Test_TRIGGER_AFTER
ON TEST_TABLE
AFTER Insert
AS
if((Select ID from TEST_TABLE) =( Select ID from INSERTED))
BEGIN
PRINT 'you have successful using AFTER'
END
ELSE
BEGIN
PRINT 'ERROR AFTER'
END

Я успешно создал триггеры, но когда я вставляю данные в свою таблицу, я получаюследующая ошибка -

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

Скажите, пожалуйста, в чем я не права.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

На линии

if((Select ID from TEST_TABLE) =( Select ID from INSERTED)) 

(Select ID from TEST_TABLE) вернет более одного значения, если в таблице более 1 записи, что недопустимо при таком дополнительном выборе.

Немного неясно, что вы здесь пытаетесь сделать.

1 голос
/ 17 ноября 2010

Проблема с обоими триггерами заключается в следующей строке:

if((Select ID from TEST_TABLE) =( Select ID from INSERTED))

Непонятно, что вы пытаетесь проверить, но таблицы TEST_TABLE и INSERTED могут содержать несколько строк.

0 голосов
/ 17 ноября 2010

Проблема в том, что вы делаете SELECT ID FROM TEST_TABLE, который возвращает несколько записей. Вам необходимо добавить к этому WHERE предложение, чтобы уменьшить его до 1 записи для успешного прохождения теста.

Вы можете попробовать что-то вроде:

DECLARE @id int;
SELECT @id = ID from INSERTED;

SELECT ID
  FROM TEST_TABLE
 WHERE ID = @id;

IF @@ROWCOUNT > 0
BEGIN 
    PRINT 'you have successful using FOR' 
END 
ELSE 
BEGIN 
    PRINT 'ERROR AFTER' 
END 
...