2012-01-23 5 views
7

EDIT: Я не знаю, что это за дистрибутив, это в экзаменационной статье.SQL: Записи триггеров VS для каждой строки

Я просто не получаю это, к сожалению. Я вполне доволен триггерами уровня Row, но кто-нибудь может объяснить мне, как результаты будут отличаться, если вместо триггера был уровень выводов?

связь/Заявление Trigger/Row Level Trigger

Employee(ID VARCHAR2(30), Salary NUMBER) 


Create Trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
update Employee 
Set salary = salary + (select avg(salary) from NT) 


Create trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
For each Row 
Update employee 
Set salary = salary + (select avg(salary) from NT) 

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

Я пробовал искать, но я просто не могу опустить голову.

Спасибо,

EDIT: Теперь, я просто быть плотным, но будет либо триггер производить различные выходы? Для триггера уровня заявления, если я использовал пример значение:

В таблице перед созданием триггера:

(A,50) 

Добавлены в одном заявлении после запуска создается:

(B,70), (C,30) 

Первый триггер будет установлен зарплата за каждый кортеж вставляется, конечно? Таким образом, первое значение будет равно 120 (среднее значение равно 50, 70 + 50 = 120), а второе - 80. Если это так, то как второй триггер отличается результатами?

+2

** WHAT ** база данных система и в какой версии вы говорите? ** SQL ** - это только язык структурированных запросов - язык, используемый многими системами баз данных - SQL - это ** НЕ ** продукт базы данных ... такие вещи, как это очень часто зависят от поставщика, - поэтому нам действительно нужно знать, что система баз данных, о которой вы говорите .... –

+0

VARCHAR2, похоже, указывает, что это Oracle. Но синтаксис недействителен, потому что нет такой вещи, как «ссылка на новую таблицу как ...», а также начало/конец. –

+0

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

ответ

4

Разница заключается в том, что в случае триггера уровня оператора SELECT avg(salary) FROM NT вернется в среднем зарплаты для вставленных строк, а в случае уровня строк, avg(salary) всегда равны salary новой записи (триггер выполняется для каждой строки в отдельности). Кроме того, триггер уровня выполнения будет выполняться, если никакие записи не пострадали. В случае триггера уровня большинство RDMS не запускают его, если 0 записей затронуты.

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

+0

Привет, спасибо за ответ. Теперь, я просто плотный, но либо выработал бы разные результаты?Для триггера уровня заявление, если я использовал пример значения: В таблице перед созданием триггера: '(A, 50)' Добавлен в одно заявление после того, как триггер создан: '(B, 70), (C, 30) ' Первый триггер установил бы зарплату для каждого вставленного набора, верно? Таким образом, первое значение будет равно 120 (среднее значение равно 50, 70 + 50 = 120), а второе - 80. Если это так, то как второй триггер отличается результатами? –

+1

Для второго триггера (уровень строки) он будет другим: 1-я строка (B, 70) вставлена: 70 + avg (70) = 140. Вставка второй строки (30): 1-я строка (140 +30) = 170, вторая 30 + 30 = 60. Триггер запуска будет выполняться дважды, для каждой строки 'NEW_TABLE' будет 1 запись. – a1ex07

+0

Кроме того, очень вероятно, что в случае триггера уровня вы получите ошибку (или вам нужно добавить некоторую логику, которая обрабатывает уровень рекурсии, если RDMS разрешает рекурсию в триггере), поскольку он пытается изменить одну и ту же таблицу. – a1ex07

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