Làm cách nào để thiết lập lược đồ mặc định của người dùng Oracle?


12

Tôi đã tạo một vài người dùng mới trong Oracle. Tuy nhiên, khi chạy sqlplus, tất cả chúng cần phải đủ điều kiện tên bảng trong truy vấn. Cách tốt nhất để đặt lược đồ mặc định cho những người dùng mới này là gì?

Câu trả lời:


19

Không có gì giống như PostgreSQL set search_pathtrong Oracle.

Thứ gần nhất tôi có thể nghĩ đến sẽ là một trình kích hoạt đăng nhập cho người dùng chạy 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;
/  

Nếu danh sách người dùng không quá dài, bạn có thể tạo trình kích hoạt đăng nhập cơ sở dữ liệu để bạn không phải tạo trình kích hoạt đó cho mỗi người dùng:

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;
/  

Tất nhiên, danh sách người dùng mà bạn muốn thay đổi lược đồ mặc định cũng có thể được lấy từ một bảng. Trong trường hợp đó, bạn chỉ cần chèn hoặc xóa các hàng từ đó để "kích hoạt" tính năng này (thay vì tạo lại kích hoạt mỗi lần).

Một tùy chọn khác là tạo các từ đồng nghĩa mỗi khi bạn tạo người dùng trỏ đến các bảng thực. Bạn có thể tự động hóa việc sử dụng một thủ tục được lưu trữ lặp qua tất cả các bảng trong một lược đồ và tạo các từ đồng nghĩa cho chúng trong lược đồ khác.

Trừ khi tất cả người dùng Oracle của bạn làm việc trên cùng một bảng, tôi sẽ khuyên bạn không nên sử dụng các từ đồng nghĩa công khai mà bạn chỉ phải tạo một lần - chúng có thể gây ra nhiều rắc rối nếu người dùng ứng dụng khác nhau tồn tại trong cài đặt của bạn.

Chỉnh sửa :

Theo đề xuất của Alex, đây là trình kích hoạt đăng nhập để kiểm tra vai trò thay vì tên người dùng:

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;
/

Ý tưởng tuyệt vời nhưng vì when others then null;là một tất cả, nó sẽ làm phức tạp việc khắc phục sự cố vì nó làm cho bất kỳ lỗi nào trở nên vô hình. Có thể loại bỏ hoàn toàn việc xử lý ngoại lệ hoặc ghi lại lỗi trên máy chủ trong giao dịch AUTONOMOUS và sau đó RA lại nó ?
George3

@ George3: nhưng nếu ngoại lệ thực sự bị ném, người dùng không thể đăng nhập - Tôi chỉ muốn ngăn người khác không thể đăng nhập chỉ vì một lỗi ngu ngốc trong trình kích hoạt. Nhưng bất cứ ai cũng có thể tự do thích nghi với bất cứ điều gì anh ấy / cô ấy muốn.
a_horse_with_no_name

0

Tôi sẽ không nghĩ rằng có một cách để thiết lập một. Người dùng là lược đồ. AFAIK bạn chỉ có thể đặt không gian bảng mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.