このトピックでは、サンプルアプリケーションのセキュリティ例を示します。
次の例では、データベースと2人のユーザーhr_mgrおよびsales_mgrが作成されます。
- hr_mgrは、hr_mgrスキーマ内のサンプルアプリケーション全体のレプリカを所有します。
- sales_mgrはsales_mgrスキーマを所有しています。 このスキーマには、営業部門で働く従業員のみを含むempテーブルのみのレプリカがあります。
この例では、list_empプロシージャ、hire_clerk関数、およびemp_adminパッケージが使用されています。 サンプルアプリケーションのインストール時に付与されたすべてのデフォルト特権が削除され、明示的な方法を使用して最小特権が付与されます。 これにより、より安全な環境が保証される。
list_empおよびhire_clerkプログラムは、デフォルトの定義者権限から呼び出し者権限に変更されます。 次に、sales_mgrがこれらのプログラムを実行すると、sales_mgrスキーマのempテーブルに作用します。 これは、これらのプログラムが名前解決と認証チェックにsales_mgrの検索パスと特権を使用するためです。
次に、sales_mgrはemp_adminパッケージでget_dept_nameおよびhire_empプログラムを実行します。 この場合、hr_mgrは定義者権限を使用するemp_adminパッケージの所有者であるため、hr_mgrスキーマのdeptテーブルとempテーブルにアクセスします。 $userプレースホルダーを含むデフォルトの検索パスが有効になります。 したがって、hr_mgrに一致するスキーマを使用してテーブルを見つけます。
データベースとユーザーの作成
ユーザーpolardbとしてhrデータベースを作成します。
データベースの作成hr;
hrデータベースに切り替えてユーザーを作成します。
\c hr polardb
CREATE USER hr_mgrパスワードで識別;
CREATE USER sales_mgrパスワードで識別;
サンプルアプリケーションの作成
hr_mgrスキーマ内のhr_mgrが所有するサンプルアプリケーション全体を作成します。
polar-sample.sqlファイルには次の内容が含まれています。
ドロップテーブルIF EXISTS deptカスケード;
ドロップテーブルIF EXISTS empカスケード;
ドロップテーブルIF EXISTS jobhistカスケード;
テーブル部門の作成 (
deptno NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
dname VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,
loc VARCHAR2 (13)
);
テーブルempの作成 (
empno NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp_ref_dept_fk
参照部 (deptno)
);
-rowidsと;
テーブルjobhistを作成する (
empno NUMBER(4) NOT NULL,
startdate DATE NOT NULL,
enddate DATE,
job VARCHAR2(9),
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2),
chgdesc VARCHAR2(80),
CONSTRAINT jobhist_pk PRIMARY KEY (empno, startdate),
CONSTRAINT jobhist_ref_emp_fk FOREIGN KEY (empno)
REFERENCES emp(empno) ON DELETE CASCADE,
CONSTRAINT jobhist_ref_dept_fk FOREIGN KEY (deptno)
REFERENCES dept (deptno) ON DELETE SET NULL,
CONSTRAINT jobhist_date_chkチェック (startdate <= enddate)
);
すべてをempで公開します。公共部門にすべてを与える;
ジョブリストにすべてを公に与えます。部門の値に挿入する (10、「会計」、「ニューヨーク」);
部門の値に挿入する (20、「研究」、「ダラス」);
部門の値に挿入する (30、「サラダ」、「シカゴ」);
部門の値に挿入します (40、'OPERATIONS '、'BOSTON');
INSERT INTO emp VALUES (7369、'SMITH' 、'CLERK' 、7902、'17-DEC-80 '、800、NULL、20);
INSERT INTO emp VALUES (7499、'ALLEN' 、'SALESMAN' 、7698、'20-FEB-81 '、1600,300、30);
INSERT INTO emp VALUES (7521、'WARD' 、'SALESMAN' 、7698、'22-FEB-81 '、1250,500、30);
INSERT INTO emp VALUES (7566、'JONES' 、'MANAGER' 、7839、'02-APR-81 '、2975、NULL、20);
INSERT INTO emp VALUES (7654、'MARTIN' 、'SALESMAN' 、7698、'28-SEP-81 '、1250,1400、30);
INSERT INTO emp VALUES (7698、'BLAKE' 、'MANAGER' 、7839、'01-MAY-81 '、2850、NULL、30);
INSERT INTO emp VALUES (7782、'CLARK '、'MANAGER' 、7839、'09-JUN-81' 、2450、NULL、10);
INSERT INTO emp VALUES (7788、'SCOTT' 、'ANALYST' 、7566、'19-APR-87 '、3000、NULL、20);
INSERT INTO emp VALUES (7839、'KING '、'PRESIDENT' 、NULL、'17-NOV-81' 、5000、NULL、10);
emp値に挿入する (7844、'TURNER' 、'SALESMAN' 、7698、'08-SEP-81 '、1500,0、30);
INSERT INTO emp VALUES (7876、'ADAMS' 、'CLERK '、7788、'23-MAY-87' 、1100、NULL、20);
INSERT INTO emp VALUES (7900、'JAMES' 、'CLERK' 、7698、'03-DEC-81 '、950、NULL、30);
INSERT INTO emp VALUES (7902、'FORD '、'ANALYST' 、7566、'03-DEC-81' 、3000、NULL、20);
INSERT INTO emp VALUES (7934、「ミル」、「CLERK」、7782、「23-JAN-82」、1300、NULL、10);
INSERT INTO jobhist VALUES (7369、'17-DEC-80 '、NULL、'CLERK' 、800、NULL、20、'New Hire ');
INSERT INTO jobhist VALUES (7499、'20-FEB-81 '、NULL、'SALESMAN' 、1600,300、30、'New Hire');
INSERT INTO jobhist VALUES (7521、'22-FEB-81 '、NULL、'SALESMAN' 、1250,500、30、'New Hire');
INSERT INTO jobhist VALUES (7566、'02-APR-81 '、NULL、'MANAGER' 、2975、NULL、20、'New Hire');
INSERT INTO jobhist VALUES (7654、'28-SEP-81 '、NULL、'SALESMAN' 、1250,1400、30、'New Hire');
INSERT INTO jobhist VALUES (7698、'01-MAY-81 '、NULL、'MANAGER' 、2850、NULL、30、'New Hire');
INSERT INTO jobhist VALUES (7782、'09-JUN-81 '、NULL、'MANAGER' 、2450、NULL、10、'New Hire');
INSERT INTO jobhist VALUES (7788、'19-APR-87 '、'12-APR-88' 、'CLERK '、1000、NULL、20、'New Hire');
INSERT INTO jobhist VALUES (7788、「13-APR-88」、「04-MAY-89」、「CLERK」、1040、NULL、20、「Raise」);
INSERT INTO jobhist VALUES (7788、'05-MAY-90 '、NULL、'ANALYST' 、3000、NULL、20、'Promoted to Analyst');
INSERT INTO jobhist VALUES (7839、'17-NOV-81 '、NULL、'PRESIDENT' 、5000、NULL、10、'New Hire');
INSERT INTO jobhist VALUES (7844、'08-SEP-81 '、NULL、'SALESMAN' 、1500,0、30、'New Hire');
INSERT INTO jobhist VALUES (7876、'23-MAY-87 '、NULL、'CLERK' 、1100、NULL、20、'New Hire ');
INSERT INTO jobhist VALUES (7900、'03-DEC-81 '、'14-JAN-83' 、'CLERK '、950、NULL、10、'New Hire');
INSERT INTO jobhist VALUES (7900、「15-JAN-83」、NULL、「CLERK」、950、NULL、30、「30部に変更」);
INSERT INTO jobhist VALUES (7902、'03-DEC-81 '、NULL、'ANALYST' 、3000、NULL、20、'New Hire');
INSERT INTO jobhist VALUES (7934、'23-JAN-82 '、NULL、'CLERK' 、1300、NULL、10、'New Hire ');
CREATE TABLE emp_spl (
empno NUMBER (4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2) CONSTRAINT emp_sal_ckチェック (sal > 0) 、
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp1_ref_dept_fk
参照部 (deptno)
);
emp_splですべてを公開します。-- 'emp_spl' テーブルを読み込む
INSERT INTO emp_spl VALUES (7369、'SMITH' 、'CLERK' 、7902、'17-DEC-80 '、800、NULL、20);
INSERT INTO emp_spl VALUES (7499、'ALLEN' 、'SALESMAN' 、7698、'20-FEB-81 '、1600,300、30);
INSERT INTO emp_spl VALUES (7521、'WARD' 、'SALESMAN' 、7698、'22-FEB-81 '、1250,500、30);
INSERT INTO emp_spl VALUES (7566、'JONES' 、'MANAGER' 、7839、'02-APR-81 '、2975、NULL、20);
INSERT INTO emp_spl VALUES (7654、'MARTIN' 、'SALESMAN' 、7698、'28-SEP-81 '、1250,1400、30);
INSERT INTO emp_spl VALUES (7698、'BLAKE' 、'MANAGER' 、7839、'01-MAY-81 '、2850、NULL、30);
INSERT INTO emp_spl VALUES (7782、'CLARK '、'MANAGER' 、7839、'09-JUN-81' 、2450、NULL、10);
INSERT INTO emp_spl VALUES (7788,'SCOTT','ANALYST',7566,'19-APR-87 ',3000,NULL,20);
INSERT INTO emp_spl VALUES (7839、'KING '、'PRESIDENT' 、NULL、'17-NOV-81' 、5000、NULL、10);
INSERT INTO emp_spl VALUES (7844、'TURNER' 、'SALESMAN' 、7698、'08-SEP-81 '、1500,0、30);
INSERT INTO emp_spl VALUES (7876,'ADAMS','CLERK ',7788,'23-MAY-87',1100,NULL,20);
INSERT INTO emp_spl VALUES (7900,'JAMES','CLERK ',7698,'03-DEC-81',950,NULL,30);
INSERT INTO emp_spl VALUES (7902、'FORD '、'ANALYST' 、7566、'03-DEC-81' 、3000、NULL、20);
INSERT INTO emp_spl VALUES (7934,'MILLER','CLERK ',7782,'23-JAN-82',1300,NULL,10);
-----------------------------------------------------------------
-- 'dept_db' テーブルを作成する
テーブルの作成dept_db (
deptno NUMBER (2) NOT NULL CONSTRAINT dept1_pk PRIMARY KEY,
dname VARCHAR2(14) CONSTRAINT dept1_dname_uq UNIQUE、
loc VARCHAR2 (13)
);
-- 'dept_db' テーブルをロードする
dept_db値に挿入する (10、「会計」、「ニューヨーク」);
INSERT INTO dept_db VALUES (20、'RESEARCH' 、'DALLAS');
INSERT INTO dept_db VALUES (30、'SALES' 、'CHICAGO');
挿入してからdept_db値 (40, 'OPERATIONS ','BOSTON');
-- 'emp_db' テーブルを作成する
CREATE TABLE emp_db (
empno NUMBER (4) NOT NULL CONSTRAINT emp2_pk PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2) CONSTRAINT emp2_sal_ck CHECK (sal > 0) 、
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT emp2_ref_dept_fk
参照部 (deptno)
);
emp_dbですべてを公開します。-- 'emp_db' テーブルを読み込む
INSERT INTO emp_db VALUES (7369、'SMITH' 、'CLERK' 、7902、'17-DEC-80 '、800、NULL、20);
INSERT INTO emp_db VALUES (7499、'ALLEN' 、'SALESMAN' 、7698、'20-FEB-81 '、1600,300、30);
INSERT INTO emp_db VALUES (7521、'WARD' 、'SALESMAN' 、7698、'22-FEB-81 '、1250,500、30);
INSERT INTO emp_db VALUES (7566、'JONES' 、'MANAGER' 、7839、'02-APR-81 '、2975、NULL、20);
INSERT INTO emp_db VALUES (7654、'MARTIN' 、'SALESMAN' 、7698、'28-SEP-81 '、1250,1400、30);
INSERT INTO emp_db VALUES (7698、'BLAKE' 、'MANAGER' 、7839、'01-MAY-81 '、2850、NULL、30);
INSERT INTO emp_db VALUES (7782、'CLARK' 、'MANAGER' 、7839、'09-JUN-81 '、2450、NULL、10);
INSERT INTO emp_db VALUES (7788、'SCOTT' 、'ANALYST' 、7566、'19-APR-87 '、3000、NULL、20);
INSERT INTO emp_db VALUES (7839、'KING '、'PRESIDENT' 、NULL、'17-NOV-81' 、5000、NULL、10);
INSERT INTO emp_db VALUES (7844、'TURNER' 、'SALESMAN' 、7698、'08-SEP-81 '、1500,0、30);
INSERT INTO emp_db VALUES (7876、'ADAMS' 、'CLERK' 、7788、'23-MAY-87 '、1100、NULL、20);
INSERT INTO emp_db VALUES (7900,'JAMES','CLERK',7698,'03-DEC-81 ',950,NULL,30);
INSERT INTO emp_db VALUES (7902、'FORD' 、'ANALYST' 、7566、'03-DEC-81 '、3000、NULL、20);
INSERT INTO emp_db VALUES (7934、'MILLER' 、'CLERK '、7782、'23-JAN-82' 、1300、NULL、10);
-後のテストが暗黙的に依存する設定を確認します。 このセクションの場合
-fails、テスト環境はサポートされていません。その後の失敗を表示する
-疑いを持って。 この部分に * only * テスト失敗がある場合
-設定が与えられ、サポートされているステータスを認識するように更新します。
SELECT current_user;
SELECT name, 設定FROM pg_settings WHERE name IN
('bytea_output' 、'polar_comp_redwood_strings '、'port')
1による注文;
-幅広いキャラクターレパートリーが必要です。1つの言語に固有のエンコーディング
-十分ではありません。 この記事の執筆時点で、LATIN1の下でスイートを実行すると
-約14のテストが失敗します。 これらのテストを実行することでそれを修正する必要があります
-多くのテストですでに行っているように、目的で作成されたUTF8データベースで。 次に、-このチェックを削除できます。
-
-UnicodeまたはC照合にも依存していますが、テストするのは困難です。
SELECT名、pg_settingsからの設定
WHERE name IN ('client_encoding', 'server_encoding')
そしてNOT IN ('SQL_ASCII' 、'UTF8') を設定します。-ARTSの実行中に使用される2つのデータベースの作成
-テストケースのダンプと復元。
-- データベースregression_backupは、-そしてダンプを取ります。 ダンプを取った後、それは常にきれいになるべきです
-残りのオブジェクトがない。
CREATE DATABASE regression_backup TEMPLATE=template0 LC_COLLATE='C' LC_CTYPE='C';
-- データベースregression_restoreは、ダンプを復元するために使用されます。-オブジェクトを確認します。 復元検証後、常に
-残りのオブジェクトなしでクリーニングされました。
CREATE DATABASE regression_restore TEMPLATE=template0 LC_COLLATE='C' LC_CTYPE='C';
次の方法に基づいてサンプルアプリケーションを作成します。
\c - hr_mgr
\i polar-sample.sql
開始
テーブルの作成
テーブルの作成
テーブルの作成
ビューの作成
シーケンスの作成
.
.
.
パッケージの作成
パッケージボディを作成する
COMMIT
sales_mgrスキーマにempテーブルを作成する
sales_mgrスキーマでsales_mgrが所有するempテーブルのサブセットを作成します。
\c - hr_mgr
SCHEMA hr_mgrでsales_mgrに適用されます。\c - sales_mgr
SELECTとしてTABLE empを作成する * hr_mgr.emp WHERE job = 'SALESMAN';
上記の例では、GRANT USAGE ON SCHEMAステートメントが提供されています。 このステートメントにより、sales_mgrはhr_mgrスキーマにアクセスしてhr_mgrのempテーブルを複製できます。 この手順は、PolarDB for PostgreSQL (Oracle互換) で実行する必要があります。 ただし、各スキーマはユーザーに関連付けられており、Oracleデータベースのユーザー名と同じ名前を持つため、この手順はOracleデータベースと互換性がありません。
デフォルトの権限を削除する
以降の操作で必要最小限の特権を付与できるように、すべての特権を削除します。
\c - hr_mgr
SCHEMA hr_mgrでの使用をsales_mgrから再開する。公共からdeptのすべてをREVOKE;
パブリックからのempのすべてをREVOKE;
パブリックからnext_empnoですべてをREVOKE;
PUBLICからの機能に関するREVOKE EXECUTE new_empno();
PUBLICからの手順list_empの実行を開始します。PUBLICからの機能hire_clerk(VARCHAR2、NUMBER) のREVOKE EXECUTE;
パッケージのREVOKE EXECUTE公開からemp_admin;
list_empを呼び出し元の権利に変更する
PolarDBデータベースにhr_mgrとして接続し、list_empプログラムにAUTHID CURRENT_USER句を追加してから、PolarDB for PostgreSQL (Compatible with Oracle) でプログラムを再保存します。 この手順を実行するときは、必ずhr_mgrとしてログオンしてください。 それ以外の場合、変更されたプログラムはhr_mgrスキーマではなくパブリックスキーマに存在する可能性があります。
CREATE OR REPLACE PROCEDURE list_emp
認証CURRENT_USER
IS
v_empno NUMBER(4);
v_ename VARCHAR2(10);
CURSOR emp_cur IS
SELECT empno、ename FROM emp ORDER BY empno;
開始
OPEN emp_cur;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur INTO v_empno, v_ename;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
クローズemp_cur;
エンド;
hire_clerkを呼び出し権に変更し、new_empnoへの呼び出しを修飾します
PolarDBデータベースにhr_mgrとして接続し、AUTHID CURRENT_USER句をhire_clerkプログラムに追加します。
同時に、new_empno参照をhr_mgr.new_empnoに完全に修飾し、参照をBEGINステートメントに従わせます。 これにより、new_empno関数へのhire_clerk関数呼び出しがhr_mgrスキーマに解決されます。
プログラムを再保存するときは、必ずhr_mgrとしてログオンしてください。 それ以外の場合、変更されたプログラムはhr_mgrスキーマではなくパブリックスキーマに存在する可能性があります。
機能の作成または交換hire_clerk ()
p_ename VARCHAR2,
p_deptno番号
) リターン番号
認証CURRENT_USER
IS
v_empno NUMBER(4);
v_ename VARCHAR2(10);
v_job VARCHAR2(9);
v_mgr NUMBER(4);
v_hiredate DATE;
v_sal NUMBER(7,2);
v_comm NUMBER(7,2);
v_deptno番号 (2);
開始
v_empno := hr_mgr.new_empno;
INSERT INTO emp VALUES (v_empno, p_ename, 'CLERK', 7782,
TRUNC(SYSDATE), 950.00, NULL, p_deptno);
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno INTO
v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno
FROM emp WHERE empno = v_empno;
DBMS_OUTPUT.PUT_LINE('Department : ' || v_deptno);
DBMS_OUTPUT.PUT_LINE('Employee No: ' || v_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || v_job);
DBMS_OUTPUT.PUT_LINE('Manager : ' || v_mgr);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || v_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || v_sal);
DBMS_OUTPUT.PUT_LINE('Commission : ' || v_comm);
戻りv_empno;
例外
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('The following is SQLERRM:');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE('The following is SQLCODE:');
DBMS_OUTPUT.PUT_LINE(SQLCODE);
リターン-1;
エンド;
必要な権限の付与
PolarDBデータベースにhr_mgrとして接続し、sales_mgrがlist_empプロシージャ、hire_clerk関数、およびemp_adminパッケージを実行できるように、必要に応じて権限を付与します。 sales_mgrがアクセスできる唯一のデータオブジェクトは、sales_mgrスキーマのempテーブルです。 sales_mgrには、hr_mgrスキーマのテーブルに対する権限がありません。
SCHEMA hr_mgrでsales_mgrへの穀物の使用;
手続き上のGRANT EXECUTE list_emp TO sales_mgr;
機能hire_clerk(VARCHAR2、NUMBER) をsales_mgrに許可します。機能の承認実行new_empno() からsales_mgr;
パッケージの承認執行emp_adminからsales_mgr;
list_empおよびhire_clerkプログラムを実行する
sales_mgrとしてPolarDBデータベースに接続し、次の匿名ブロックを実行します。
\c - sales_mgr
DECLARE
v_empno番号 (4);
開始
hr_mgr.list_emp;
DBMS_OUTPUT.PUT_LINE('*** Adding new employee ***');
v_empno := hr_mgr.hire_clerk('JONES',40);
DBMS_OUTPUT.PUT_LINE('*** After new employee added ***');
hr_mgr.list_emp;
エンド;
EMPNO ENAME
----- -------
7499アレン
7521ワード
7654マーティン
7844ターナー
*** 新しい従業員の追加 ***
部署: 40
従業員番号: 8000
名前: ジョーンズ
仕事: CLERK
マネージャー: 7782
レンタル日: 08-NOV-07 00:00:00
給与: 950.00
*** 新しい従業員が追加された後 ***
EMPNO ENAME
----- -------
7499アレン
7521ワード
7654マーティン
7844ターナー
8000ジョーンズ
次の図は、匿名ブロックのプログラムによってアクセスされるテーブルとシーケンスを示しています。 灰色の楕円形は、sales_mgr および hr_mgr スキーマを表します。 各プログラム実行中のユーザーは、太字の赤フォントで括弧内に表示されます。

sales_mgrのempテーブルからデータをクエリすると、このテーブルで更新が行われたことが示されます。
SELECT empno, ename, hiredate, sal, deptno, hr_mgr.emp_admin.get_dept_name(deptno) sales_mgr.empから;
empno | ename | hiredate | sal | deptno | get_dept_name
------ -------- -------------------- ---------------------------------------
7499 | ALLEN | 20-FEB-81 00:00:00 | 1600.00 | 30 | SALES
7521 | WARD | 22-FEB-81 00:00:00 | 1250.00 | 30 | SALES
7654 | MARTIN | 28-SEP-81 00:00:00 | 1250.00 | 30 | SALES
7844 | TURNER | 08-SEP-81 00:00:00 | 1500.00 | 30 | SALES
8000 | ジョーンズ | 08-NOV-07 00:00:00 | 950.00 | 40 | 操作
(5行)
次の図は、SELECTステートメントがsales_mgrスキーマのempテーブルを参照することを示しています。 ただし、emp_adminパッケージのget_dept_name関数によって参照されるdeptテーブルは、hr_mgrスキーマからのものです。 これは、emp_adminパッケージには定義権限があり、hr_mgrが所有しているためです。 $userプレースホルダーを含むデフォルトの検索パスは、hr_mgrスキーマのdeptテーブルへのhr_mgrによるアクセスを解決します。

emp_adminパッケージでhire_empプログラムを実行する
sales_mgrとしてPolarDBデータベースに接続し、emp_adminパッケージでhire_empプログラムを実行します。
EXEC hr_mgr.emp_admin.hire_emp(9001、'ALICE '、'SALESMAN' 、8000、TRUNC(SYSDATE) 、1000,7369、40);
次の図は、定義者権限を持つemp_adminパッケージのhire_empプログラムがhr_mgrに属するempテーブルを更新したことを示しています。 これは、hr_mgrのオブジェクト特権が使用され、$userプレースホルダーを含むデフォルトの検索パスがhr_mgrスキーマに解決されるためです。

PolarDBデータベースにhr_mgrとして接続します。 次のSELECTステートメントは、新しい従業員がhr_mgrのempテーブルに追加されたことを確認します。 これは、emp_adminパッケージには定義権限があり、hr_mgrがemp_adminの所有者であるためです。
\c - hr_mgr
SELECT empno, ename, hiredate, sal, deptno, hr_mgr.emp_admin.get_dept_name(deptno) hr_mgr.empから;
empno | ename | hiredate | sal | deptno | get_dept_name
------ -------- -------------------- ---------------------------------------
7369 | SMITH | 17-DEC-80 00:00:00 | 800.00 | 20 | RESEARCH
7499 | ALLEN | 20-FEB-81 00:00:00 | 1600.00 | 30 | SALES
7521 | WARD | 22-FEB-81 00:00:00 | 1250.00 | 30 | SALES
7566 | JONES | 02-APR-81 00:00:00 | 2975.00 | 20 | RESEARCH
7654 | MARTIN | 28-SEP-81 00:00:00 | 1250.00 | 30 | SALES
7698 | BLAKE | 01-MAY-81 00:00:00 | 2850.00 | 30 | SALES
7782 | CLARK | 09-JUN-81 00:00:00 | 2450.00 | 10 | ACCOUNTING
7788 | SCOTT | 19-APR-87 00:00:00 | 3000.00 | 20 | RESEARCH
7839 | KING | 17-NOV-81 00:00:00 | 5000.00 | 10 | ACCOUNTING
7844 | TURNER | 08-SEP-81 00:00:00 | 1500.00 | 30 | SALES
7876 | ADAMS | 23-MAY-87 00:00:00 | 1100.00 | 20 | RESEARCH
7900 | JAMES | 03-DEC-81 00:00:00 | 950.00 | 30 | SALES
7902 | FORD | 03-DEC-81 00:00:00 | 3000.00 | 20 | RESEARCH
7934 | MILLER | 23-JAN-82 00:00:00 | 1300.00 | 10 | ACCOUNTING
9001 | アリス | 08-NOV-07 00:00:00 | 8000.00 | 40 | 操作
(15行)