Làm thế nào để hiển thị tất cả các đặc quyền từ một người dùng trong oracle?


113

Ai đó có thể vui lòng cho tôi biết cách hiển thị tất cả các đặc quyền / quy tắc từ một người dùng cụ thể trong sql-console không?

Câu trả lời:


164

Bạn có thể thử các chế độ xem dưới đây.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

DBA và những người dùng thành thạo khác có thể tìm thấy các đặc quyền được cấp cho những người dùng khác có DBA_phiên bản của các chế độ xem tương tự này. Chúng được đề cập trong tài liệu .

Các chế độ xem đó chỉ hiển thị các đặc quyền được cấp trực tiếp cho người dùng. Việc tìm kiếm tất cả các đặc quyền, bao gồm cả những đặc quyền được cấp gián tiếp thông qua các vai trò, yêu cầu các câu lệnh SQL đệ quy phức tạp hơn:

select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs  where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;

21

Có nhiều tập lệnh khác nhau sẽ làm điều đó tùy thuộc vào mức độ điên rồ bạn muốn có được. Cá nhân tôi sẽ sử dụng tập lệnh find_all_privs của Pete Finnigan .

Nếu bạn muốn tự viết nó, truy vấn sẽ khá khó khăn. Người dùng có thể được cấp các đặc quyền hệ thống được hiển thị trong DBA_SYS_PRIVS. Chúng có thể được cấp các đặc quyền đối tượng được hiển thị trong DBA_TAB_PRIVS. Và họ có thể được cấp các vai trò hiển thị trong DBA_ROLE_PRIVS(các vai trò có thể là mặc định hoặc không mặc định và cũng có thể yêu cầu mật khẩu, vì vậy chỉ vì người dùng đã được cấp một vai trò không có nghĩa là người dùng nhất thiết có thể sử dụng các đặc quyền của mình có được thông qua vai trò theo mặc định). Nhưng những vai trò có thể, đến lượt nó, có đặc quyền được cấp hệ thống, đặc quyền đối tượng, và vai trò bổ sung có thể được xem bằng cách nhìn vào ROLE_SYS_PRIVS, ROLE_TAB_PRIVSROLE_ROLE_PRIVS. Tập lệnh của Pete đi qua các mối quan hệ đó để hiển thị tất cả các đặc quyền cuối cùng sẽ chuyển cho người dùng.


Các kịch bản được tuyệt vời chỉ cần kiểm tra nó ra
I.Tyger

1
Bạn cần có đặc quyền đối với gói UTL_FILE, nếu không bạn sẽ gặp lỗi khi chạy tập lệnh của Pete Finnigan: "số nhận dạng 'UTL_FILE' phải được khai báo". Bạn có thể kết nối dưới dạng sys với roll sysdba thông qua SQL Developer và sau đó nó sẽ hoạt động hoặc cấp cho bạn các đặc quyền thực thi cho gói này bằng cách sử dụng: cấp thực thi trên UTL_FILE cho <người dùng>;
Ngày

1
Và đối với những người trong chúng ta không có SYSđặc quyền và chỉ muốn xem xét các đặc quyền trong tài khoản của riêng mình, thì kịch bản hoàn toàn vô giá trị. Tôi không có quyền truy cập UTL_FILEvà cũng như DBA_SYS_PRIVScác khu vực khác DBASYScác khu vực mà tập lệnh xem xét.
vapcguy

Tôi không nghĩ ROLE_SYS_PRIVS, ROLE_TAB_PRIVSROLE_ROLE_PRIVScần phải được kiểm tra. Các tài liệu cho biết chúng dành cho người dùng hiện tại .
jpmc26

Nếu ai đó có bản sao của những đoạn script này, họ có thể đăng ở đây hoặc ở đâu đó thường xuyên hơn một chút như ý chính không? Trang web đã ngừng hoạt động.
Michael Thompson

7

Một nguồn hữu ích khác:

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS

2
Ngoại trừ trường hợp bạn không có DBAhoặc SYSvai trò và bạn chỉ muốn tìm các đặc quyền của tài khoản của riêng mình.
vapcguy

2

Mặc dù câu trả lời của Raviteja Vutukuri hoạt động và nhanh chóng kết hợp lại với nhau, nhưng nó không đặc biệt linh hoạt để thay đổi các bộ lọc và không giúp ích quá nhiều nếu bạn đang tìm cách làm điều gì đó theo chương trình. Vì vậy, tôi đặt lại truy vấn của riêng mình:

SELECT
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME,
    LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
    MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
    MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
    -- Gets all roles a user has, even inherited ones
    WITH ALL_ROLES_FOR_USER AS (
        SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
        FROM DBA_ROLE_PRIVS
        CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
    )
    SELECT
        PRIVILEGE,
        OBJ_OWNER,
        OBJ_NAME,
        USERNAME,
        REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
        ADMIN_OR_GRANT_OPT,
        HIERARCHY_OPT
    FROM (
        -- System privileges granted directly to users
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- System privileges granted users through roles
        SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
        FROM DBA_SYS_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
        UNION ALL
        -- Object privileges granted directly to users
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
        UNION ALL
        -- Object privileges granted users through roles
        SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
        FROM DBA_TAB_PRIVS
        JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
    ) ALL_USER_PRIVS
    -- Adjust your filter here
    WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
    PRIVILEGE,
    OBJ_OWNER,
    OBJ_NAME,
    USERNAME
;

Ưu điểm:

  • Tôi có thể dễ dàng lọc theo nhiều phần thông tin khác nhau, như đối tượng, đặc quyền, cho dù đó là thông qua một vai trò cụ thể, v.v. chỉ bằng cách thay đổi một WHEREmệnh đề đó.
  • Đó là một truy vấn duy nhất, có nghĩa là tôi không phải tính toán các kết quả cùng nhau.
  • Nó giải quyết vấn đề liệu họ có thể cấp đặc quyền hay không và liệu nó có bao gồm các đặc quyền cho các subobject (phần "phân cấp") qua các nguồn khác biệt của đặc quyền hay không.
  • Thật dễ dàng để xem mọi thứ tôi cần làm để thu hồi đặc quyền, vì nó liệt kê tất cả các nguồn của đặc quyền.
  • Nó kết hợp các đặc quyền của bảng và hệ thống thành một chế độ xem nhất quán duy nhất, cho phép chúng tôi liệt kê tất cả các đặc quyền của người dùng trong một lần rơi.
  • Đó là một truy vấn , không phải là một chức năng giải phóng tất cả điều này ra DBMS_OUTPUThay thứ gì đó (so với tập lệnh được liên kết của Pete Finnigan). Điều này làm cho nó hữu ích cho việc sử dụng theo chương trình và xuất khẩu.
  • Bộ lọc không lặp lại; nó chỉ xuất hiện một lần. Điều này giúp bạn dễ dàng thay đổi hơn.
  • Truy vấn con có thể dễ dàng được lấy ra nếu bạn cần kiểm tra từng cá nhân GRANT.

Một số VIỆC CẦN LÀM đối với bản thân tôi: 1. Thêm chỉ báo nếu người dùng có thể cấp đặc quyền bằng cách cấp vai trò cho người dùng khác. 2. Tìm ra cách thực hiện việc này cho người dùng hiện tại không có đặc quyền DBA. Có thể liên quan đến USER_SYS_PRIVS(các đặc quyền hệ thống được cấp trực tiếp), USER_TAB_PRIVS(đối tượng được cấp trực tiếp priv) USER_ROLE_PRIVS(vai trò được cấp trực tiếp của người dùng), ROLE_ROLE_PRIVS(để nhận các vai trò kế thừa), ROLE_SYS_PRIVS(hệ thống đặc quyền thông qua các vai trò) và ROLE_TAB_PRIVS(đối tượng privs thông qua các vai trò). Ặc. Oracle rất phức tạp.
jpmc 26

1

Bạn có thể sử dụng mã dưới đây để nhận tất cả danh sách đặc quyền từ tất cả người dùng.

select * from dba_sys_privs 

Điều này không liệt kê tất cả các đặc quyền. Như được chứng minh bởi một số câu trả lời khác trước của bạn nhiều năm , nó bỏ qua các đặc quyền bảng và tất cả các đặc quyền được cấp thông qua các vai trò.
jpmc26

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.