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:

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

 

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 dsb. Harga Rp. 24.800,- (157 halaman)

 

Related Articles

 

Comments

[…] PL/SQL Subprograms | Hastinapura […]

[…] Silahkan melanjutkan membaca pembahasan PL/SQL Subprograms […]

[…] Klausa AUTHID menentukan apakah seluruh subprogram-subprogram ter-package dijalankan dengan privileges dari definer (default) atau invoker-nya, dan apakah referensi tak terkualifikasi dari mereka terhadap schema objects ditetapkan di dalam schema dari definer atau invoker tersebut. Untuk informasi lebih, kita dapat membaca kembali pembahasan PL/SQL Subprograms. […]

[…] Dynamic SQLPL/SQL Object TypesPL/SQL PackagesPL/SQL SubprogramsInteraksi PL/SQL dengan […]

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word