SQL: оператор запускает VS для каждой строки - PullRequest
7 голосов
/ 23 января 2012

РЕДАКТИРОВАТЬ: Я не знаю, что это за дистрибутив, это в экзаменационной работе.

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

Отношение / Триггер оператора / Триггер уровня строки

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)

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

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

Спасибо

РЕДАКТИРОВАТЬ: Теперь я просто плотно, но будет ли триггер производить разные выходы? Для триггера уровня оператора, если я использовал значения примера:

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

(A,50)

Добавлено в оператор ONE после создания триггера:

(B,70), (C,30)

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

1 Ответ

4 голосов
/ 23 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...