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ì?
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:
Không có gì giống như PostgreSQL set search_path
trong 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;
/
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ó ?