Rất có thể, vấn đề là khoản tài trợ được thực hiện thông qua một vai trò. Các đặc quyền được cấp cho người dùng không khả dụng trong quy trình lưu trữ các quyền của người xác định (mặc định).
Trong SQL Developer, việc xác minh đây là sự cố tương đối dễ dàng. Nếu bạn chạy lệnh
SET ROLE none
và sau đó chạy câu lệnh SELECT, tôi mong rằng bạn sẽ gặp phải lỗi ORA-00942 tương tự.
Giả sử đúng như vậy, giải pháp thường là yêu cầu chủ sở hữu của các bảng trong lược đồ YYY cấp quyền truy cập trực tiếp vào các bảng cho bạn thay vì cấp quyền truy cập thông qua một vai trò. Ngoài ra, bạn có thể xác định thủ tục đã lưu trữ của mình như một thủ tục được lưu trữ các quyền của kẻ xâm lược bằng cách thêm AUTHID CURRENT_USER vào khai báo. Điều đó có nghĩa là người gọi thủ tục sẽ cần có quyền truy cập vào các đối tượng cơ bản nhưng nó sẽ cho phép thủ tục của bạn sử dụng các đặc quyền được cấp thông qua một vai trò.
Nếu bạn muốn tạo một thủ tục được lưu trữ quyền của kẻ xâm lược, bạn cũng sẽ cần tham chiếu đến tên bảng bằng cách sử dụng SQL động để hoãn kiểm tra đặc quyền trong thời gian chạy. Vì vậy, bạn sẽ có một cái gì đó giống như
CREATE OR REPLACE PROCEDURE PRC_SOMESP
AUTHID CURRENT_USER
AS
l_cnt pls_integer;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM yyy.TableA' INTO l_cnt;
END PRC_SOMESP;
nếu bạn muốn một thủ tục lưu trữ các quyền của kẻ xâm lược đã truy vấn bảng TableA trong lược đồ XXX.