ฉันสร้างผู้ใช้ใหม่ใน Oracle อย่างไรก็ตามเมื่อเรียกใช้ sqlplus พวกเขาทั้งหมดต้องผ่านการรับรองชื่อตารางในแบบสอบถามอย่างครบถ้วน วิธีที่ดีที่สุดในการตั้งค่าสคีมาเริ่มต้นสำหรับผู้ใช้ใหม่เหล่านี้คืออะไร
ฉันสร้างผู้ใช้ใหม่ใน Oracle อย่างไรก็ตามเมื่อเรียกใช้ sqlplus พวกเขาทั้งหมดต้องผ่านการรับรองชื่อตารางในแบบสอบถามอย่างครบถ้วน วิธีที่ดีที่สุดในการตั้งค่าสคีมาเริ่มต้นสำหรับผู้ใช้ใหม่เหล่านี้คืออะไร
คำตอบ:
ไม่มีอะไรที่เหมือนกับ PostgreSQL set search_path
ใน Oracle
สิ่งที่ใกล้เคียงที่สุดที่ฉันนึกได้ก็คือการเข้าสู่ระบบสำหรับผู้ใช้ที่รัน 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;
/
หากรายชื่อผู้ใช้ไม่ยาวเกินไปคุณสามารถสร้างทริกเกอร์การเข้าสู่ระบบฐานข้อมูลเพื่อให้คุณไม่ต้องสร้างทริกเกอร์นั้นสำหรับผู้ใช้แต่ละคน:
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;
/
แน่นอนรายชื่อผู้ใช้ที่คุณต้องการเปลี่ยนสคีมาเริ่มต้นสามารถนำมาจากตารางได้เช่นกัน ในกรณีดังกล่าวคุณจะต้องแทรกหรือลบแถวจากที่นั่นเพื่อ "เปิดใช้งาน" คุณลักษณะนี้ (แทนที่จะสร้างทริกเกอร์ใหม่ทุกครั้ง)
ตัวเลือกอื่นคือการสร้างคำเหมือนทุกครั้งที่คุณสร้างผู้ใช้ที่ชี้ไปที่ตารางจริง คุณสามารถทำให้เป็นอัตโนมัติได้โดยใช้กระบวนงานที่เก็บไว้ซึ่งวนรอบตารางทั้งหมดในหนึ่งสคีมาและสร้างคำพ้องความหมายสำหรับพวกเขาในสคีมาอื่น ๆ
เว้นแต่ทั้งหมดผู้ใช้ Oracle ของคุณทำงานบนโต๊ะเดียวกันฉันจะขอแนะนำให้ใช้ประชาชนคำพ้องความหมายที่คุณจะต้องสร้างเพียงครั้งเดียว - พวกเขาสามารถทำให้เกิดปัญหามากหากผู้ใช้แอพลิเคชันที่แตกต่างกันอยู่ในการติดตั้ง
แก้ไข :
ทำตามคำแนะนำของ Alex นี่คือทริกเกอร์การเข้าสู่ระบบที่ตรวจสอบบทบาทแทนชื่อผู้ใช้:
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;
/
ฉันไม่คิดว่าจะมีวิธีการตั้งค่าหนึ่ง ผู้ใช้คือสคีมา AFAIK คุณสามารถตั้งค่า tablespace เริ่มต้นได้เท่านั้น
when others then null;
เป็นการดักจับทั้งหมดมันจะทำให้การแก้ไขปัญหาซับซ้อนเนื่องจากทำให้มองไม่เห็นข้อผิดพลาดใด ๆ อาจลบข้อยกเว้นการจัดการทั้งหมดหรือบันทึกข้อผิดพลาดบนเซิร์ฟเวอร์ในการทำธุรกรรม AUTONOMOUS แล้วทำการเพิ่มใหม่อีกครั้งหรือไม่