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?
Tidak ada yang seperti PostgreSQL set search_path
di 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;
/
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 ?Saya tidak akan berpikir ada cara untuk mengaturnya. Pengguna adalah skema. AFAIK Anda hanya dapat mengatur tablespace default.
sumber