2012-05-12 3 views
4

Я нахожу, что есть только после и вместо триггеров в sql-сервере. И изменять значения во вложенной таблице pesudo запрещено. Тогда возникает моя проблема: если я хочу проверить данные, которые будут вставлены в мою таблицу, а когда данные нарушают мои ограничения, я должен изменить эти значения на значения по умолчанию, как это сделать? Как обновить значения после вставления? Однако, если нет первичного ключа или colum, который является уникальным в моей таблице, как я могу найти только что вставленную строку и затем обновить ее?T-SQL как изменить значение перед вставкой

+2

Точка триггеров 'INSTEAD OF' заключается в том, что вы можете« захватить »эту операцию (например,« INSERT'), а затем сделать что-то * вместо *, что нормальная работа. Таким образом, вы можете считывать значения, изменять их, а затем вызывать 'INSERT' внутри триггера' INSTEAD OF INSERT', чтобы вставить измененные данные. –

+0

. Проблема в том, что если структура таблицы изменяется, вам нужно подумать об изменении триггер. Oracle вместо этого позволяет вам обновить эквивалент «вставленного» объекта («новый»), который гораздо логичнее. –

ответ

11

В основном, с INSTEAD OF INSERT триггером, вы можете добиться того, что вы ищете - просто считывать данные из таблицы INSERTED псевдо, изменить его, и вставить его в таблицу

Таким образом, ваш триггер будет выглядеть что-то вроде этого:

CREATE TRIGGER YourTrigger ON dbo.YourTable  
INSTEAD OF INSERT 
AS 
    SET NOCOUNT ON 

    -- do the INSERT based on the INSERTED pseudo table, modify data as needed 
    INSERT INTO dbo.YourTable(Col1, Col2, ....., ColN) 
     SELECT 
      Col1, 2 * Col2, ....., N * ColN 
     FROM 
      INSERTED 

Конечно, вы также можете добавить, например проверяет в виде WHERE пункт SELECT .... FROM INSERTED. игнорировать некоторые строки - возможности бесконечны!

+0

Большое спасибо. Это действительно работает. :-) – tmj

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