Одна из создаваемых ниже триггерных процедур отвечает за правку данных, необходимую для работы старой редакции приложений, во время работы нового, а вторая наоборот. Существенно, что транслироваться обе перекрестные процедуры должны быть приписаны новой редакции: ALTER SESSION SET EDITION = app_release_1;
CREATE OR REPLACE TRIGGER cross_forward_job BEFORE INSERT OR UPDATE ON emp_tab FOR EACH ROW FORWARD CROSSEDITION
BEGIN SELECT jobid INTO :new.jobno FROM job WHERE :new.job = jname; END; /
CREATE OR REPLACE TRIGGER cross_reversed_job BEFORE INSERT OR UPDATE ON emp_tab FOR EACH ROW REVERSE CROSSEDITION
BEGIN SELECT jname INTO :new.job FROM job j WHERE :new.jobno = jobid; END; /
Проверку способен организовать следующий код: CONNECT scott/tiger ALTER SESSION SET EDITION = ora$base;
INSERT INTO yard.emp ( empno, ename, job ) VALUES ( 1111, 'OBAMA', 'CLERK' ); COMMIT; ALTER SESSION SET EDITION = app_release_1;
INSERT INTO yard.emp ( empno, ename, jobno ) VALUES ( 2222, 'LADEN', 2 ); COMMIT;
Как и раньше, если транзакция успела изменить какие-нибудь данные в БД, для настройки на новую редакцию ее потребуется сначала закрыть. В результате получим: SQL> SELECT * FROM yard.emp WHERE empno IN ( 1111, 2222 );
EMPNO ENAME JOBNO MGR HIREDATE SAL COMM DEPTNO ---------- ------- ---------- -------- --------- ------- ------- -------- 1111 OBAMA 2
2222 LADEN 2
SQL> ALTER SESSION SET EDITION = ora$base;
Session altered.
SQL> SELECT * FROM yard.emp WHERE empno IN ( 1111, 2222 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ------- --------- -------- --------- ------- ------- -------- 1111 OBAMA CLERK
2222 LADEN CLERK
При работе со старой редакцией воспроизводится поведение старой таблицы EMP, а при работе с новой – с тою же таблицей, но в новом варианте.