--手順1: ユーザー・アカウントの作成
GRANT CREATE SESSION, CREATE ANY CONTEXT, CREATE PROCEDURE, CREATE TRIGGER, ADMINISTER DATABASE TRIGGER
TO sysadmin_ctx IDENTIFIED BY oracle;
GRANT SELECT ON HR.EMPLOYEES TO sysadmin_ctx;
GRANT EXECUTE ON DBMS_SESSION TO sysadmin_ctx;
GRANT CREATE SESSION TO LOZER IDENTIFIED BY oracle;
--手順2: データベース・セッション・ベースのアプリケーション・コンテキストの作成
conn sysadmin_ctx/oracle
--手順3: セッション・データを取得してアプリケーション・コンテキストを設定するパッケージの作成
CREATE CONTEXT empno_ctx USING set_empno_ctx_pkg;
CREATE OR REPLACE PACKAGE set_empno_ctx_pkg IS
PROCEDURE set_empno;
END;
/
CREATE OR REPLACE PACKAGE BODY set_empno_ctx_pkg IS
PROCEDURE set_empno
IS
emp_id HR.EMPLOYEES.EMPLOYEE_ID%TYPE;
BEGIN
SELECT EMPLOYEE_ID INTO emp_id FROM HR.EMPLOYEES
WHERE email = SYS_CONTEXT('USERENV', 'SESSION_USER');
DBMS_SESSION.SET_CONTEXT('empno_ctx', 'employee_id', emp_id);
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END;
END;
/
--手順4: パッケージに対するログイン・トリガーの作成
CREATE TRIGGER set_empno_ctx_trig AFTER LOGON ON DATABASE
BEGIN
sysadmin_ctx.set_empno_ctx_pkg.set_empno;
END;
/
--手順5: アプリケーション・コンテキストのテスト
conn lozer/oracle
SELECT SYS_CONTEXT('empno_ctx', 'employee_id') emp_id FROM DUAL;
conn test/test
SELECT SYS_CONTEXT('empno_ctx', 'employee_id') emp_id FROM DUAL;