PL/SQL Subprograms

8.18.2. Menentukan Privileges untuk Sebuah Subprogram dengan Klausa AUTHID

Untuk mengimplementasikan invoker rights, kita dapat menggunakan klausa AUTHID, yang menentukan apakah sebuah subprogram dijalankan dengan privileges dari owner-nya atau user terkini-nya. Ia juga menentukan apakah external references (yaitu, referensi  ke objek-objek di luar subprogram tersebut) dilakukan di dalam schema dari owner ataukah user terkini (current user).

Klausa AUTHID diperbolehkan hanya di dalam header dari sebuah standalone subprogram, sebuah package spec, atau sebuah object type spec. Sintaks dari header tersebut adalah

-- standalone function
CREATE [OR REPLACE] FUNCTION [schema_name.]function_name
[(parameter_list)] RETURN datatype
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
-- standalone procedure
CREATE [OR REPLACE] PROCEDURE [schema_name.]procedure_name
[(parameter_list)]
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
-- package spec
CREATE [OR REPLACE] PACKAGE [schema_name.]package_name
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
-- object type spec
CREATE [OR REPLACE] TYPE [schema_name.]object_type_name
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS} OBJECT

dimana DEFINER adalah opsi default. Di dalam sebuah package atau object type, klausa AUTHID diaplikasikan kepada seluruh subprograms.

Catatan: Kebanyakan PL/SQL packages yang telah tersedia (seperti DBMS_LOB, DBMS_PIPE, DBMS_ROWID, DBMS_SQL, dan UTL_REF) merupakan invoker-rights packages.

8.18.3. Siapakah User Terkini Selama Eksekusi Subprogram?

Dalam sebuah urutan pemanggilan, jika sebuah invoker-rights subprogram merupakan subprogram pertama yang dipanggil, maka current user-nya adalah session user tersebut. Hal ini benar sampai sebuah definer-rights subprogram dipanggil, yang mana owner dari subprogram tersebut menjadi current user. Jika definer-rights subprogram memanggil beberapa invoker-rights subprograms, mereka dijalankan dengan privileges dari owner-nya. Ketika definer-rights subprogram diakhiri, maka control kembali kepada current user sebelumnya.

8.18.4. Bagaimana Referensi-referensi Eksternal Ditetapkan dalam Invoker-Rights Subprograms

Jika kita menentukan AUTHID CURRENT_USER, privileges dari current user diperiksa saat run time, dan referensi-referensi eksternal ditetapkan di dalam schema dari current user tersebut. Namun, hal ini diterapkan hanya terhadap referensi-referensi eksternal di dalam:

  • Perintah-perintah manipulasi data SELECT, INSERT, UPDATE, dan DELETE
  • Perintah pengontrol transaksi LOCK TABLE
  • Perintah-perintah pengontrol cursor OPEN dan OPEN-FOR
  • Perintah-perintah SQL dinamis EXECUTE IMMEDIATE dan OPEN-FOR-USING
  • Perintah-perintah SQL yang di-parse menggunakan DBMS_SQL.PARSE()

Untuk perintah-perintah lainnya, privileges dari owner diperiksa saat waktu peng-compile-an, dan referensi-referensi eksternal ditetapkan di dalam schema dari owner. Sebagai contoh, perintah-perintah pemberian nilai di bawah ini mengacu kepada function ter-package balance. Referensi eksternal ini ditetapkan di dalam schema owner dari procedure reconcile.

CREATE PROCEDURE reconcile (acc_id IN INTEGER)
AUTHID CURRENT_USER AS
bal NUMBER;
BEGIN
  bal := bank_ops.balance(acct_id);
  ...
END;

8.18.4.1. Kebutuhan untuk Template Objects dalam Invoker-Rights Subprograms

Referensi-referensi eksternal di dalam sebuah invoker-rights subprograms ditetapkan di dalam schema dari current user saat run time. Namun, PL/SQL compiler harus menetapkan seluruh referensi-referensi saat compile time. Sehingga, owner tersebut harus menciptakan template objects di dalam schema-nya sebelumnya. Saat run time, template objects dan actual objects tersebut harus sesuai. Sebaliknya, kita mendapatkan sebuah error atau hasil-hasil yang tidak diharapkan.

Sebagai contoh, misalkan user scott menciptakan database table dan standalone procedure berikut ini:

CREATE TABLE emp (
empno NUMBER(4),
ename VARCHAR2(15));
/
CREATE PROCEDURE evaluate (my_empno NUMBER)
AUTHID CURRENT_USER AS
my_ename VARCHAR2(15);
BEGIN
  SELECT ename INTO my_ename FROM emp WHERE empno = my_empno;
  ...
END;
/

Sekarang, misalkan user blake menciptakan sebuah database table yang mirip, kemudian memanggil procedure evaluate, seperti berikut ini:

CREATE TABLE emp (
empno NUMBER(4),
ename VARCHAR2(15),
my_empno NUMBER(4)); -- note extra column
/
DECLARE
  ...
BEGIN
  ...
  scott.evaluate(7788);
END;
/

Pemanggilan procedure tersebut dijalankan tanpa kesalahan kecuali mengabaikan kolom my_empno di dalam table yang diciptakan oleh user blake. Hal ini dikarenakan table sebenarnya di dalam schema dari current user tersebut tidak sesuai dengan template table yang digunakan saat compile time.

 

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


Bookmark and Share

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb.

 

Find Related articles