2010-03-04 15 views
8

tôi chủ yếu là một người mới oracle, vì vậy tha thứ cho tôi nếu đây là một câu hỏi ngu ngốc ...Thực thi một Proc Oracle lưu trữ như Một tài

Tôi có một schema gọi là 'CODE' với một proc lưu trữ mà thực hiện tùy ý SQL (bây giờ, xin vui lòng bỏ qua các vấn đề an ninh tiềm năng liên quan đến điều đó). SQL được truyền vào sẽ chọn dữ liệu; nhưng tất cả dữ liệu nằm trong lược đồ A, B hoặc C - nhưng SQL sẽ chỉ bao giờ chọn từ MỘT lược đồ tại một thời điểm.

Ví dụ: Người dùng loại A tạo chuỗi 'SELECT * FROM A.USERTABLE' - trong khi người dùng loại B tạo chuỗi 'SELECT * FROM B.USERTABLE'.

Điều tôi đang cố gắng làm là cho phép người dùng không chỉ định rõ ràng lược đồ của họ. Trong ứng dụng net. Tôi đã biết nếu họ là loại A, B, hoặc C. Tôi muốn cả ba chỉ cần nhập 'SELECT * FROM USERTABLE'.

Sự cố tôi gặp phải là tôi không biết cách thực hiện điều đó. Ứng dụng của tôi chỉ có thể thực hiện proc trong lược đồ 'CODE' - vì vậy tôi không thể chỉ sao chép mã và cho phép người dùng A gọi 'A.ExecuteSQL'.

Tôi đã thử một vài điều; nhưng không có gì đã làm việc cho đến nay. Tôi muốn proc ExecuteSQL ở lại trong lược đồ CODE; nhưng khi 'USERTABLE' được chuyển vào, tôi cần nó biết rằng đôi khi điều đó có nghĩa là A.USERNAME và đôi khi B.USERNAME.

Mọi đề xuất?

Trả lời

10

Sử dụng:

ALTER SESSION SET CURRENT_SCHEMA = schema 

Đó là equivalent to SQL Server's EXECUTE AS syntax.

+0

Tính năng này hoạt động như thế nào? Ứng dụng đầu tiên thực hiện câu lệnh 'ALTER' này hoặc thực hiện điều này trong thủ tục' CODE'? – Guru

+1

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:588045400346317188 có một số thông tin khác. Dường như bạn có thể làm điều đó với sql động (thực hiện ngay) bên trong proc được lưu trữ của bạn. –

+0

@Guru: Xem liên kết AskTom của Rob P –

7

Một tùy chọn khác sẽ sử dụng AUTHID CURRENT_USER pragma.

Nếu bạn thêm hai từ khóa này ngay sau gói, thủ tục, chức năng hoặc tên loại, nó sẽ thực thi với các đặc quyền của người dùng thực thi, chứ không phải là lược đồ CODE. Này ghi đè hành vi mặc định đó là AUTHID DEFINER (những đặc quyền của schema/người dùng biên soạn code)

tức

CREATE FUNCTION examplefunc 
    (pSqlStatement IN VARCHAR2) 
RETURN INTEGER 
    AUTHID CURRENT_USER 
AS 
    lResult INTEGER; 
BEGIN 
    EXECUTE IMMEDIATE pSqlStatement INTO lResult; 
    RETURN lResult; 
END examplefunc; 

Lưu ý rằng cho các chức năng và thủ tục trong nội bộ một gói, các pragma chỉ có thể được áp dụng ở cấp gói. Bạn không thể đặt quyền trên cơ sở cho mỗi chức năng.

Điều này sẽ gây ra bất kỳ SQL bên trong hàm, gói, v.v., để thực thi với các đặc quyền của người dùng.

Tôi đã sử dụng để quản lý một 'chạy bất kỳ bit cũ của SQL động' thường xuyên - ít nhất bạn sẽ dừng người dùng 'bình thường' khỏi việc sử dụng thủ tục lưu trữ của bạn để thả bảng hoặc cài đặt mã bổ sung trong lược đồ CODE.

(Cũng có thể có giá trị - nếu bạn chưa thêm một số xác nhận để loại bỏ các từ khóa nhất định - nghĩa là phải bắt đầu bằng SELECT, không được chứa các khối pl/sql được nhúng mã hiện có).