วิธีการตั้งค่าสคีมาเริ่มต้นของผู้ใช้ Oracle?


12

ฉันสร้างผู้ใช้ใหม่ใน Oracle อย่างไรก็ตามเมื่อเรียกใช้ sqlplus พวกเขาทั้งหมดต้องผ่านการรับรองชื่อตารางในแบบสอบถามอย่างครบถ้วน วิธีที่ดีที่สุดในการตั้งค่าสคีมาเริ่มต้นสำหรับผู้ใช้ใหม่เหล่านี้คืออะไร

คำตอบ:


19

ไม่มีอะไรที่เหมือนกับ 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;
/

เป็นแนวคิดที่ดี แต่เนื่องจากwhen others then null;เป็นการดักจับทั้งหมดมันจะทำให้การแก้ไขปัญหาซับซ้อนเนื่องจากทำให้มองไม่เห็นข้อผิดพลาดใด ๆ อาจลบข้อยกเว้นการจัดการทั้งหมดหรือบันทึกข้อผิดพลาดบนเซิร์ฟเวอร์ในการทำธุรกรรม AUTONOMOUS แล้วทำการเพิ่มใหม่อีกครั้งหรือไม่
George3

@ George3: แต่ถ้ามีข้อผิดพลาดเกิดขึ้นจริงผู้ใช้ไม่สามารถเข้าสู่ระบบได้ - ฉันแค่ต้องการที่จะป้องกันไม่ให้ใครบางคนที่ไม่สามารถเข้าสู่ระบบได้เพียงเพราะโง่ที่ผิดพลาดในทริกเกอร์ แต่ทุกคนมีอิสระที่จะปรับตัวให้เข้ากับสิ่งที่เขา / เธอต้องการ
a_horse_with_no_name

0

ฉันไม่คิดว่าจะมีวิธีการตั้งค่าหนึ่ง ผู้ใช้คือสคีมา AFAIK คุณสามารถตั้งค่า tablespace เริ่มต้นได้เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.