2015-12-03 2 views
-2

Я хочу написать триггер, когда в определенном столбце вставлено определенное значение, а не целая таблица, например, я хочу, чтобы мой триггер срабатывал, когда значение NewName вставляется в столбец Namesstudents таблица.Триггеры SQL Server по определенному столбцу и значению

CREATE TRIGGER newtrg 
ON students 
AFTER INSERT 
AS BEGIN 
    PRINT 'Trigger fired!' 
END 
+1

Вы должны помнить, что значения не вставлены. Строки вставлены, а один из столбцов - NewName. Столбец ВСЕГДА. Хотите, чтобы это выполнялось при вставке и обновлении? Если обновить информацию о том, когда значение будет обновлено в запросе, но значение будет одинаковым? –

+0

Первым шагом к созданию триггеров является знание того, какую СУБД вы используете (у вас есть как MySQL, так и SQL Server, отмеченные тегами - выберите один.) И первым шагом к получению помощи является * на самом деле задающий вопрос *. Покажите свои попытки и задайте вопросы о том, на что вы застряли. – Siyual

+0

ОК, извините, я имею в виду строку вместо ценности, я отредактировал сообщение, теперь вы можете мне помочь? –

ответ

0

Вы должны понять, как триггеры работы в SQL Server - они стреляют по на заявление уровне - не в строке - так что вы не можете просто проверить, если строка вставляется содержит NewName в Столбец Names - оператор INSERT может вставлять десятки строк одновременно, и ваш триггер будет запускать только для всего утверждения.

Таким образом, вы не можете предотвратить одну строку с вставкой - если ваш INSERT заявление вставлено 57 строк и один из них содержит NewName в Names колонке, вы можете просто изменить это значение на этой конкретной строке, или вы можете отменить транзакцию и остановить весь процесс INSERT - NONE из 57 строк будет вставлен.

Так что же вы действительно хотите сделать, в конце концов? Если ваш INSERT из n строк содержит одну строку со значением NewNames в столбце Names - вы хотите остановить весь процесс INSERT и отменить транзакцию? В этом случае - использовать что-то вроде этого:

CREATE TRIGGER newtrg 
ON students 
AFTER INSERT 
AS 
    IF EXISTS (SELECT * FROM Inserted WHERE Names = 'NewName') 
     -- any of of the rows being inserted contains `NewName` 
     -- in this case, ABORT the whole INSERT 
     ROLLBACK TRANSACTION 

Или, если вы хотите, чтобы обновить эти строки после того, как они были вставлены, чтобы получить новое значение (вместо NewNames) - попробовать что-то вроде этого:

CREATE TRIGGER newtrg 
ON students 
AFTER INSERT 
AS 
    UPDATE s 
    SET Names = 'SomeOtherValue' 
    FROM dbo.Students s 
    INNER JOIN Inserted i ON s.StudentID = i.StudentID -- use the primary key here 
    WHERE i.Names = 'NewName' 
+0

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

+1

Вы понимаете, что если вставлено 100 строк, а _one_ из них содержит значение, все 100 строк будут отклонены? –

Смежные вопросы