Bagaimana cara mengatur skema default pengguna Oracle?

12

Saya membuat beberapa pengguna baru di Oracle. Namun, saat menjalankan sqlplus, mereka semua harus memenuhi syarat nama tabel dalam kueri. Apa cara terbaik untuk mengatur skema default untuk pengguna baru ini?

seekor kuda tanpa nama
sumber

Jawaban:

19

Tidak ada yang seperti PostgreSQL set search_pathdi Oracle.

Hal terdekat yang dapat saya pikirkan akan menjadi pemicu masuk untuk pengguna yang menjalankan ALTER SESSION SET CURRENT_SCHEMA ...

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON SCHEMA
BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION 
  when others 
    then null; -- prevent a login failure due to an exception
END;
/  

Jika daftar pengguna tidak terlalu panjang, Anda bisa membuat pemicu masuk basis data sehingga Anda tidak harus membuat pemicu itu untuk setiap pengguna:

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON DATABASE
BEGIN
    if (user in ('TOM', 'DICK', 'HARRY')) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
  when others 
    then null; -- prevent a login failure due to an exception
END logon_trg;
/  

Tentu saja daftar pengguna di mana Anda ingin mengubah skema default, juga dapat diambil dari tabel. Dalam hal ini Anda hanya perlu menyisipkan atau menghapus baris dari sana untuk "mengaktifkan" fitur ini (daripada menciptakan kembali pemicu setiap kali).

Pilihan lain adalah membuat sinonim setiap kali Anda membuat pengguna yang menunjuk ke tabel nyata. Anda bisa mengotomatisasi yang menggunakan prosedur tersimpan yang loop melalui semua tabel dalam satu skema dan membuat sinonim untuk mereka dalam skema lain.

Kecuali jika semua pengguna Oracle Anda bekerja pada tabel yang sama saya akan sangat menyarankan agar tidak menggunakan sinonim publik yang harus Anda buat hanya satu kali - mereka dapat menyebabkan banyak masalah jika pengguna aplikasi yang berbeda ada di instalasi Anda.

Edit :

Mengikuti saran Alex, berikut adalah pemicu masuk yang memeriksa peran alih-alih nama pengguna:

CREATE OR REPLACE TRIGGER LOGON_TRG
  AFTER LOGON ON DATABASE
declare
  has_role boolean;
BEGIN

    has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');

    if (has_role) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
   when others 
      then null; -- prevent a login failure due to an exception    
END logon_trg;
/
seekor kuda tanpa nama
sumber
Ide bagus tapi karena when others then null;ini adalah masalah umum, itu akan mempersulit pemecahan masalah karena membuat kesalahan tidak terlihat. Mungkin menghapus penanganan penanganan seluruhnya atau mencatat kesalahan pada server dalam transaksi AUTONOMOUS dan kemudian MENGEMBANGKAN kembali itu ?
George3
@ George3: tetapi jika pengecualian benar-benar dilemparkan, pengguna tidak dapat masuk - Saya hanya ingin mencegah seseorang tidak dapat masuk hanya karena orang bodoh yang salah dalam memicu. Tetapi siapa pun bebas untuk menyesuaikan ini dengan apa pun yang dia inginkan.
a_horse_with_no_name
0

Saya tidak akan berpikir ada cara untuk mengaturnya. Pengguna adalah skema. AFAIK Anda hanya dapat mengatur tablespace default.

cljk
sumber