2013-04-09 5 views
0

Я ищу, чтобы написать ANSI-совместимый SQL Trigger, и считаю, что я на 90% из того, что есть, но мне не хватает нескольких частей. У меня также есть некоторые вопросы/проблемы относительно его производительности (как в качестве оператора SQL, так и в качестве триггера).ANSI SQL Trigger on INSERT & UPDATE

У меня есть таблица под названием widgets:

widgets 
widget_id | widget_name | widget_type_id | widget_is_fizz 
======================================================================== 
1    Apple    1     0 
2    Kiwi    2     0 
3    Pear    3     1 
...    ...     ...     ... 
2634   Banana    28     0 

мне нужен триггер, в любое время вставки или изменения происходят на этой таблице:

  • пластини где widget_type_id составляет 17 и widget_is_fizz - 1 (true); или
  • Для получения обновлений (по той же причине, что и выше)

Когда «шипение виджет» с типом ID 17 вставлен или обновлен на этом столе, я хочу изменить его widget_name на «НЕИЗВЕСТНЫЙ» ,

До сих пор моя лучшая попытка:

CREATE TRIGGER widget_name_trigger 
    ON 
     widgets 
    FOR 
     INSERT 
    AS 
     UPDATE 
      widgets 
     SET 
      widget_name = 'UNKNOWN' 
     WHERE 
      widget_type_id = 17 
      AND 
      widget_is_fizz = 1 

До сих пор не может понять, как заставить его сделать то же самое для обновления, как это делает для вкладышей. Также не уверен, что он даже синтаксически корректен и соответствует ANSI.

Также, с точки зрения производительности, слухи гласят, что наш администратор базы данных ненавидит триггеры и, вероятно, столкнется с дракой, когда я возьму это перед собой для обзора кода. Триггеры изначально дорогие? Если да, то почему, и есть ли что-нибудь, что я могу сделать здесь, чтобы смягчить эту медлительность? Заранее спасибо.

+0

Существует не такая штука, как триггер, совместимый с ANSI. Теоретически стандарт ANSI определяет «язык PSM» для кодирования таких вещей, но ни одна из основных СУБД не реализует его (некоторые из них ближе, чем другие). –

+0

Я также хотел бы обратить внимание на то, что другие посетители считают, что связанная с DBA проблема, если таковая имеется, относительно триггеров, скорее всего, не что иное, как производительность. Обслуживание, например, может быстро стать сложным в среде с триггером (grin). – shannon

ответ

0

Вы можете использовать тот же триггер как для вставки, так и для обновления. Нет необходимости обновлять всю таблицу, только вставленную/обновленную строку.

CREATE TRIGGER widget_name_trigger 
    ON 
     widgets 
    FOR 
     INSERT, UPDATE 
    AS 
     UPDATE 
      widgets 
     SET 
      widget_name = 'UNKNOWN' 
     WHERE 
      widget_type_id = 17 
      AND 
      widget_is_fizz = 1 
      AND 
      widget_id=inserted.widget_id 

С точки зрения производительности: до тех пор, пока вы не ссылаетесь на другие таблицы, накладные расходы очень низкие.
Из руководства Sybase:

С точки зрения производительности, триггер накладные расходы, как правило, очень низкий. Время, затрачиваемое на запуск триггера, тратится в основном на ссылки на другие таблицы, которые могут быть либо в памяти, либо на устройстве базы данных.
Удаленные и вставленные триггерные тестовые таблицы всегда находятся в активной памяти. Расположение других таблиц, на которые указывает триггер, определяет время, которое занимает операция.

+0

Awesome - thanks @OfirW (+1) - можете ли вы дать мне ссылку на этот раздел руководства Sybase? Еще раз спасибо! – 2013-04-09 20:29:49

+0

Здесь вы найдете: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug832.htm Примите этот ответ –