2010-11-18 41 views
7

Tôi có bảng trong Schema A. Tôi tạo ra quan điểm trong Schema B sử dụng các bảng trong schema A.Cấp phép cho người dùng trên sơ đồ khác nhau

Tôi muốn cấp quyền truy cập cho một người dùng để chọn dữ liệu từ cái nhìn trong Schema Để làm việc này tôi biết chúng ta phải kích hoạt tùy chọn cấp trên các bảng trong Lược đồ A cho người dùng B. Nhưng tôi muốn làm điều đó trong một kịch bản duy nhất (Kịch bản này phải ở trong lược đồ B). Có cách nào để làm điều này bằng cách sử dụng tên người dùng/mật khẩu của lược đồ A.

+2

Không có ý nghĩa - tập lệnh không tồn tại trong lược đồ, chúng chỉ là danh sách các lệnh mà người dùng bạn đang kết nối với cá thể có đặc quyền để chạy. Báo cáo cấp IIRC là cho mỗi đối tượng (IE: bảng). Vui lòng lặp lại câu hỏi của bạn để rõ ràng hơn những gì bạn đang hỏi. –

Trả lời

2

Chỉ bằng cách kết nối với người dùng A tại một số điểm. Bạn vẫn có thể làm điều đó trong một kịch bản nếu bạn thực sự muốn:

connect userA/passwordA 
grant select on my_table to userB; 
connect userB/passwordB 
create view my_view as select * from userA.my_table; 

Tất nhiên bây giờ bạn có một kịch bản nằm xung quanh đó cho thấy hai bộ thông tin người dùng cho bất cứ ai có thể đọc nó. Vì vậy, một cái gì đó để suy nghĩ kỹ trước khi làm trong sản xuất, ví dụ.

Nếu bạn muốn người dùng khác có thể chọn từ chế độ xem, bạn không cần cấp quyền rõ ràng trên userA.my_table cho họ; miễn là chủ sở hữu chế độ xem có thể xem bảng bên dưới, những người dùng khác chỉ cần có thể xem chế độ xem. Mà thường là kinda điểm (hoặc một trong số họ) như bạn có thể hạn chế xem chỉ phơi bày dữ liệu được lựa chọn từ bảng cơ bản đến phần còn lại của thế giới. Tôi cho rằng bạn có lý do để không tạo chế độ xem trong lược đồ A.

Tôi không chắc liệu bạn có thực sự yêu cầu cấp quyền chọn người dùng B với tùy chọn quản trị để người dùng B có thể cấp quyền chọn cho người dùng A không bàn cho người khác. Nếu điều đó có thể, nó không có vẻ như là một ý tưởng hay, và không cần thiết cho chế độ xem hoạt động.

+0

'SYSTEM' cũng có thể áp dụng các khoản tài trợ, bạn không nhất thiết phải đăng nhập như userA. Bằng cách này bạn không cần mật khẩu trong kịch bản. –

+1

Đúng, tôi đoán tôi đã giả định rằng muốn sử dụng thông tin đăng nhập của người dùng có nghĩa là họ không có quyền riêng tư của DBA. Tôi đọc nó như họ là userB nhưng cũng xảy ra để biết userA. Làm thế nào bất thường cho một giả định tùy ý là có vấn đề ... –

4

Không có gì lạ khi muốn có một tập lệnh duy nhất để triển khai thay đổi. Vấn đề là, một kịch bản như vậy cần phải được chạy bởi một người sử dụng điện, bởi vì nó cần phải có các đặc quyền hệ thống ở mức BẤT CỨ. Điều này thường có nghĩa là một tài khoản DBA, tốt hơn là một tài khoản ứng dụng nhưng nếu không thì SYSTEM hoặc SYS.

Vì vậy, kịch bản mà bạn muốn sẽ trông như thế này:

grant select on user_a.t23 to user_b 
/
grant select on user_a.t42 to user_b 
/
create view user_b.v_69 as 
select t23.col1, t42.col2 
from user_a.t42 
     join user_a.t23 
      on (t42.id = t23.id) 
/
grant select on user_b.v_69 to user_c 
/

Một kịch bản phổ biến là chúng ta có một bộ kịch bản cá nhân mà đã được viết để được điều hành bởi người dùng khác nhau nhưng mà bây giờ chúng ta cần phải bó thành một triển khai duy nhất. Các tập lệnh gốc không chứa tên lược đồ và có nhiều lý do chính đáng khiến chúng tôi không muốn mã hóa chúng trong tập lệnh.

Một cách để xây dựng mà kịch bản tổng thể là sử dụng thay đổi cú pháp CURRENT_SCHEMA:

alter session set current_schema=USER_A 
/
@run_grants_to_userb.sql 

alter session set current_schema=USER_B 
/
@create_view69.sql 
@run_grants_to_userc.sql 

Chúng tôi vẫn cần một người dùng DBA để chạy các kịch bản tổng thể. Một lợi thế của việc chuyển đổi lược đồ hiện tại là nó cho phép chúng ta triển khai các đối tượng như các liên kết cơ sở dữ liệu, thông qua một cú pháp của cú pháp không thể có tên lược đồ trong khai báo của chúng. Một lưu ý là người dùng không thay đổi, do đó, tập lệnh sử dụng cột giả USER có thể tạo ra kết quả không mong muốn.

2

Cho phép người dùng Một khoản trợ cấp chọn trên các bảng của mình cho B và bao gồm 'tùy chọn cấp'.

Như người dùng A:

GRANT select ON table TO user_b WITH GRANT OPTION; 

Hãy sử dụng B cấp lựa chọn về quan điểm của mình để người dùng A và bao gồm các 'tùy chọn cấp'.

Là người sử dụng B:

GRANT select ON view TO user_a WITH GRANT OPTION; 

Như người dùng A:

GRANT select on user_b.view TO user_c; 

Điều này cho phép người dùng A để vượt qua cấp này sang người dùng khác.

+0

B chỉ có thể cấp quyền chọn trên giao diện cho A nếu A đã được cấp quyền với tùy chọn GRANT OPTION trên bảng của chúng. Ngoài ra, A không cần phải chọn trên khung nhìn để C có thể chọn trên khung nhìn. –

+0

Tôi đã thêm WITH GRANT OPTION trên bảng từ A đến B. Tôi nghĩ A cần chọn trên giao diện để chuyển khoản trợ cấp này cho C (như đã nêu trong câu hỏi, "Có cách nào để làm điều này bằng cách sử dụng tên người dùng/mật khẩu của lược đồ A. " –

+0

Hmmm, điều đó sẽ hoạt động. Câu hỏi là mâu thuẫn với OMG Ponies đã chỉ ra, chỉ rõ một tập lệnh trong Người dùng B sử dụng tên người dùng/mật khẩu của Người dùng B. –

1

Đơn giản chỉ cần Chạy truy vấn

CẤP INSERT, SELECT, UPDATE, DELETE ON table1 ĐẾN SCHEMA2;

Các vấn đề liên quan