すべてのプロダクト
Search
ドキュメントセンター

PolarDB:セキュリティの例

最終更新日:May 30, 2024

このトピックでは、サンプルアプリケーションのセキュリティ例を示します。

次の例では、データベースと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行)