Editionbased Redefinition Editionbased Redefinition is the killer feature
Edition-based Redefinition “Edition-based Redefinition is the killer feature of Oracle Database 11 g Release 2”. Tom Kyte www. fors. ru
Обычный сценарий обновления DEPT EMP_V_DEPT CREATE VIEW emp_v_dept AS SELECT D. deptno, D. dname, D. loc , E. empno, E. ename, E. job , E. sal, E. comm FROM dept D, emp E WHERE EMPD. deptno = E. deptno (+); DEPT_PR_PR CREATE PROCEDURE emp_pr_sal IS ID AL BEGIN V IN LI CREATE VIEW emp_v_sal AS SELECT D. dname, SUM(E. sal) AS sum_sal D I L FROM dept D, emp VEA N WHERE D. deptno I= E. deptno (+) GROUP BY D. dname; CREATE PROCEDURE emp_pr IS BEGIN LID A NV r IN (SELECT * FROM emp) LOOP IFOR NULL; END LOOP; END emp_pr; «Инвалидация» объектов - Dependency Tracking www. fors. ru D VA * FROM emp_v_sal) FOR r IN (SELECT IN LOOP NULL; END LOOP; END emp_pr_sal; EMP_V_SAL EMP_PR Oracle 10 g EMP_PR_SAL .
Обычный сценарий обновления DEPT EMP_V_DEPT EMP_PR_SAL DEPT_PR EMP DEPT_PR_PR EMP_V_SAL EMP_PR Oracle 11 g CREATE PROCEDURE emp_pr IS D BEGIN ALI NV r IN (SELECT * FROM emp) LOOP IFOR NULL; END LOOP; END emp_pr; «Инвалидация» объектов - Fine Grained Dependency Tracking www. fors. ru
Как посмотреть версию 2. С помощью SQL-функции SYS_CONTEXT('USERENV', 'параметр') CURRENT_EDITION_ID Ид. текущей версии CURRENT_EDITION_NAME Имя текущей версии SESSION_EDITION_ID Ид. версии сессии SESSION_EDITION_NAME Имя версии сессии …_EDITION_ID = {DBA|ALL}_OBJECTS. OBJECT_ID www. fors. ru
Изменение текущей версии В Oracle Database 11. 2. 0. 2 можно устанавливать версию по умолчанию для каждого сервиса БД Для одиночного экземпляра: DBMS_SERVICE. CREATE_SERVICE(… , edition => edition_name); DBMS_SERVICE. MODIFY_SERVICE (… , edition => edition_name); Для конфигурации Real Application Clusters следует использовать утилиту SRVCTL (Server Control utility) : srvctl add service. . . –t edition_name srvctl modify service. . . –t edition_name www. fors. ru
Актуализация унаследованных объектов (Actualization of Inherited Objects) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION (inherited) GRANT EXECUTE…; TRIGGER (inherited) PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www. fors. ru
Актуализация унаследованных объектов (Actualization of Inherited Objects) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION (actual) TRIGGER (inherited) PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www. fors. ru
Удаление унаследованного объекта (Dropping an Inherited Object) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION (actual) TRIGGER (inherited) DROP TRIGGER…; PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www. fors. ru
Удаление унаследованного объекта (Dropping an Inherited Object) PRE_UPG edition VIEW POST_UPG edition VIEW (inherited) FUNCTION (actual) TRIGGER (inherited) DROP TRIGGER…; PROCEDURE (inherited) POST_UPG – это потомок PRE_UPG www. fors. ru
Простейший пример CREATE PROCEDURE my_proc IS BEGIN dbms_output. put_line('Ку! Я MY_PROC. Версии-1. 0'); END; / EXEC my_proc; Ку! Я MY_PROC. Версии - 1. 0 CREATE EDITION POST_UPG AS CHILD OF ORA$BASE; ALTER SESSION SET EDITION = POST_UPG; CREATE OR REPLACE PROCEDURE my_proc IS BEGIN dbms_output. put_line(‘Ку! И я MY_PROC. Но версии-2. 0'); END; / EXEC my_proc; Ку! И я MY_PROC. Но версии-2. 0 www. fors. ru
Кросс-версионные триггеры CREATE OR REPLACE TRIGGER trg_name {BEFORE | AFTER} {INSERT| [OR] UPDATE| [OR] DELETE} ON table_name [FOR EACH ROW] {FORWARD | REVERSE} CROSSEDITION [{FOLLOWS | PRECIDES}. . . ] [ENABLE | DISABLE] { PL/SQL block } www. fors. ru
КВТ: Дополнительно почитать Функция APPLYING_CROSSEDITION_TRIGGER IF APPLYING_CROSSEDITION_TRIGGER THEN … Функция DBMS_UTILITY. WAIT_ON_PENDING_DML Хинты /*+ IGNORE_ROW_ON_DUPKEY_INDEX */ /*+ CHANGE_DUPKEY_ERROR_INDEX */ www. fors. ru
Безостановочное обновление SQL> SHOW USER is ”SCOTT” SQL> SHOW EDITION ---------------ORA$BASE Добавление столбцов в таблицу ALTER TABLE emp_rt ADD ( last_name VARCHAR 2(25) , first_name VARCHAR 2(25)); www. fors. ru
Безостановочное обновление POST_UPG Создание версионирующего представления, в «новой» версии CREATE OR REPLACE EDITIONING VIEW emp AS SELECT empno AS emp_id , last_name, first_name , job, sal, comm , deptno AS dept_id FROM emp_rt; www. fors. ru
Безостановочное обновление POST_UPG Создание прогрессивного кросс-версионного триггера CREATE OR REPLACE TRIGGER emp#BIU#R#FW BEFORE INSERT OR UPDATE ON emp_rt FOR EACH ROW FORWARD CROSSEDITION DISABLE BEGIN : NEW. last_name : = INITCAP(: NEW. ename); : NEW. first_name : = '? '; END; / www. fors. ru
Безостановочное обновление POST_UPG Создание регрессивного кросс-версионного триггера CREATE OR REPLACE TRIGGER emp#BIU#R#RV BEFORE INSERT OR UPDATE ON emp_rt FOR EACH ROW REVERSE CROSSEDITION DISABLE BEGIN : NEW. ename : = UPPER(: NEW. last_name); END; / www. fors. ru
Безостановочное обновление POST_UPG DECLARE ln_cur INTEGER; ln_ret INTEGER; BEGIN ln_cur : = dbms_sql. open_cursor; dbms_sql. parse(ln_cur, 'UPDATE emp_rt SET job = job' , dbms_sql. NATIVE , edition => 'POST_UPG' , apply_crossedition_trigger => 'emp#BIU#R#FW'); ln_ret : = dbms_sql. execute(ln_cur); dbms_sql. close_cursor(ln_cur); COMMIT; EXCEPTION WHEN OTHERS THEN IF dbms_sql. is_open(ln_cur) THEN dbms_sql. close_cursor(ln_cur); END IF; RAISE; END; / www. fors. ru
Безостановочное обновление POST_UPG DECLARE. . . BEGIN. . . -- Execute the DML in parallel l_sql_stmt : = 'UPDATE emp_rt SET job = job ‘ || 'WHERE rowid BETWEEN : start_id AND : end_id '; DBMS_PARALLEL_EXECUTE. RUN_TASK( task_name => 'mytask‘ , sql_stmt => l_sql_stmt , language_flag => DBMS_SQL. NATIVE , edition => 'POST_UPG‘ , apply_crossedition_trigger => 'emp#BIU#R#RV‘ , parallel_level => 2); . . . END; / www. fors. ru
Безостановочное обновление Создание новых индексов CREATE INDEX emp#i#first_name ON emp_rt(first_name) ONLINE INVISIBLE; Создание новых ограничений целостности ALTER TABLE emp_rt ADD CONSTRAINT emp#C#last_name CHECK (last_name = TRIM(INITCAP(last_name)) DISABLE; Проверка правильной работы новых индексов выполняется после установки в тестирующей сессии параметра оптимизации ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE; Новые индексы делаются видимыми, ограничения включаются ALTER INDEX emp#i#first_name VISIBLE; ALTER TABLE emp_rt ENABLE CONSTRAINT emp#C#last_name; www. fors. ru
Безостановочное обновление Переключение пользователей на новую версию: Предоставление привилегии на использование «новой» версии: GRANT USE ON post_upg TO allen; или GRANT USE ON post_upg TO PUBLIC; Переключение сессий триггером AFTER LOGON, созданным в «старой» версии CREATE OR REPLACE TRIGGER change_edition_after_logon AFTER LOGON ON DATABASE DISABLE BEGIN IF USER IN ('ALLEN‘, ‘DALLES’) THEN DBMS_SESSION. SET_EDITION_DEFERRED(‘POST_UPG'); END IF; END; / ALTER TRIGGER change_edition_after_logon ENABLE; www. fors. ru
До обновления EMP MY_PROC EMP_V_ST www. fors. ru
- Slides: 96