2013-12-12 2 views
1

После создания хранимой процедуры в таблице «dbo.terms», чтобы вставить данные в него, используя этот код:Создайте триггер для вставки строк в другой таблице

CREATE PROCEDURE dbo.terms 
     @Term_en      NVARCHAR(50) = NULL , 
     @Createdate     DATETIME  = NULL , 
     @Writer      NVARCHAR(50) = NULL , 
     @Term_Subdomain    NVARCHAR(50) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    INSERT INTO dbo.terms 
      (     
      Term_en      , 
      Createdate     , 
      Writer      , 
      Term_Subdomain     
     ) 
    VALUES 
      ( 
      @Term_en = 'Cat'    , 
      @Createdate = '2013-12-12'  , 
      @Writer   = 'Fadi'   , 
      @Term_Subdomain = 'English'      
     ) 

END 

GO 

Я хочу создать Trigger в это добавить еще строки в таблице dbo.term_prop

Я использовал этот код:

CREATE TRIGGER triggerdata 
    AFTER INSERT 
    ON dbo.terms 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO dbo.term_prop VALUES 
     ('قطة', term_ar, upper(:new.term_ar) , null , 'chat', term_fr, upper(:new.term_fr) , null ,'Animal', Def_en, upper(:new.Def_en) , null ,'حيوان', Def_ar, upper(:new.Def_ar) , null ,'Animal', Def_fr, upper(:new.Def_fr) , null); 
    END; 

и он показывает мне ошибку

+0

Какая ошибка? –

+0

Кроме того, почему бы не добавить лишнюю вставку в хранимую процедуру? –

+0

В триггере слишком много ошибок, я думаю, что у меня плохой синтаксис .. любая информация !? –

ответ

1

Чтобы добавить другие строки, вы можете использовать таблицу SELECTED.

Это специальная таблица, заполненная строками, вставленными в вашу транзакцию.

Примером может служить:

INSERT INTO dbo.term_prop VALUES 
    SELECT * FROM inserted 

Таким образом, вы не должны использовать для каждой строки.

Правильное определение вашего триггера будет

CREATE TRIGGER triggername ON table AFTER INSERT 
AS BEGIN 

END 
+0

Извините, вы можете быть более ясным .. Я не мог понять:/ –

+0

@AmeenChaabani: Во-первых, вы видели свой триггер определение? Меняйте с моим. –

+0

CREATE TRIGGER EnterValue НА dbo.term_prop ПОСЛЕ ВСТАВКА КАК НАЧАТЬ \t "что я должен поставить ее, чтобы вставить данные в строках" END GO –

0

Джо ответ хороший один и это больше советов.

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

Если вам нужно автогенерированное значение, вы можете сделать это, используя @@ identity или scope_identity() или ident_current().

Постарайтесь, чтобы все было просто.

0

Вау, я все еще удивляюсь, что триггеры даны плохой оберткой! Я написал дюжину статей о них давно ...

Как и в жизни, использование триггеров зависит от ситуации.

1 - Триггер отлично подходит для отслеживания изменений DDL. Кто изменил эту таблицу?

http://craftydba.com/?p=2015

2 - Триггеры могут отслеживать изменения DML (вставка, обновление, удаление). Однако на больших таблицах с большими номерами транзакций они могут замедлить обработку.

http://craftydba.com/?p=2060

Однако с сегодняшним аппаратным обеспечением, что медленно для меня может не быть медленным для вас.

3 - Триггеры отлично подходят для отслеживания логинов и/или изменений сервера.

http://craftydba.com/?p=1909

Итак, давайте вернемся к центру и говорить о вашей ситуации.

Почему вы пытаетесь сделать дубликат записи только для действия вставки?

Другие варианты прямо из SQL Server Engine, чтобы решить эту проблему, являются:

1 - Перенос данных из таблицы 1 в таблице 2 с помощью настраиваемого задания. «Вставить в таблицу 1 выберите * из таблицы 2, где etl_flag = 0;». Конечно, сделайте транзакцию и обновите флаг после завершения вставки. Я просто рассматриваю вставки без удаления или обновления.

2 - Если вы хотите отслеживать только изменения, проверьте сбор данных изменений. Он читается из журнала транзакций. Это не так быстро, как триггер, т. Е. Не срабатывает для каждой записи. Просто запускается как SQL Agent Job в фоновом режиме для загрузки cdc.tables.

3 - Репликация данных с одного сервера1.database1.table1 на server2.database2.table2.

ETC ...

Я надеюсь, что мой пост напоминает всем, что ситуация определяет решение.

Триггеры хороши в определенных ситуациях, иначе они были бы удалены из продукта давным-давно.

И если ситуация изменится, то решение, возможно, придется изменить ...

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