вопрос про триггеры в СУБД

pitrik2

имеется табличка с двумя полями: col1, col2
там одна запись: (1, 2)
делается апдейт таблицы
UPDATE tab1 SET col1 = 3;
в триггере BEFORE UPDATE
:Оld.col1 будет равно 1
:Оld.col2 будет равно 2
:New.col1 будет равно 3
а чему будет равно :New.col2 ?
варианта я так понимаю три
1) 2, тоесть старому значению
2) NULL
3) при обращении к этому полю будет вылетать эксепшн
если первый или второй вариант, то возникает другой вопрос: как в триггере узнать апдейтиться поле col2 сейчас или нет?

zya369

а чем плох вариант
4) 2, тоесть новому значению - имхо самое логичное
В ДБ2 какой-то при создании триггера можно было отдельно указать условие типа NewRow.col1 <> OldRow.col1 и типа если оно 0 то триггер не дергался

oleg701

Ты говоришь про СУБД, а пишешь в терминах Oracle.
Лично я думаю, что описал правильный вариант.
В DB2 прямо в определении триггера можно написать, на изменение каких столбцов он должен реагировать (UPDATE OF column-names и тогда если триггер сработал, значит поле изменилось.
CREATE TRIGGER TR_change_managers
BEFORE UPDATE OF DepartmentHeadID
ON Departments
REFERENCING OLD AS old_dept NEW AS new_dept
FOR EACH ROW
BEGIN
UPDATE Employees
SET Employees.ManagerID=new_dept.DepartmentHeadID
WHERE Employees.DepartmentID=old_dept.DepartmentID
END;

KViH

NewRow.col1 <> OldRow.col1
а если поле обновляется, но значение не поменялось?
по-моему нельзя узнать, а зачем это нужно?

zya369

вон эдвард (тезка чтоле:?) верно сказал про ДБ2 - я уже подзабыл что там в точности и как
а если поле обновляется, но значение не поменялось?
по-моему нельзя узнать, а зачем это нужно?

че-то я тебе недопонял...
ты хочешь узнать именно какие колонки были указаны в update'е ? если да, то нафига?

sinet

как в триггере узнать апдейтиться поле col2 сейчас или нет?
IF UPDATING('COL2') THEN

pitrik2

IF UPDATING('COL2') THEN
спасибки
так и сделал

pitrik2

если да, то нафига?
потому что мне надо знать именно когда обновлялась колонка
например: я хочу это в лог автоматом записать
я конечно могу навесить на каждую колонку свой триггер, но мне хочутся иметь именно один
IF UPDATING('COL2') THEN
как раз то что нужно
а в других СУБД есть такое, или это примочка оракловская?

pitrik2

Ты говоришь про СУБД, а пишешь в терминах Oracle.
не понял
что конкретно я написал в терминах оракла?
говорю про СУБД, потому что мне интересно как это в различных устроено

oleg701

:Оld.col1 будет равно 1
:Оld.col2 будет равно 2
:New.col1 будет равно 3
Вот эти :new и :оld - это оракловые примочки.
З.Ы. - видимо тезки.

pitrik2

ты извращенец?
отличие от DB2 только в двоеточии

Vantucha

в MSSQL вообще нет триггеров уровня строки, вроде
Оставить комментарий
Имя или ник:
Комментарий: