Как просмотреть список пользователей, которые имеют доступ к таблице красного смещения? - PullRequest
0 голосов
/ 31 августа 2018

Как получить список пользователей, которые имеют доступ к определенной таблице / схеме красного смещения?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вот SQL дает вам право выбора / вставки / обновления / удаления для каждого объекта

Вы можете использовать схему, таблицу, пользовательский фильтр, используя / комментируя те, которые вы не используете в конце SQL.

    SELECT * 
    FROM 
        (
        SELECT 
            schemaname
            ,objectname
            ,usename
            ,HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'select') AND has_schema_privilege(usrs.usename, schemaname, 'usage')  AS sel
            ,HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'insert') AND has_schema_privilege(usrs.usename, schemaname, 'usage')  AS ins
            ,HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'update') AND has_schema_privilege(usrs.usename, schemaname, 'usage')  AS upd
            ,HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'delete') AND has_schema_privilege(usrs.usename, schemaname, 'usage')  AS del
            ,HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'references') AND has_schema_privilege(usrs.usename, schemaname, 'usage')  AS ref
        FROM
            (
            SELECT schemaname, 't' AS obj_type, tablename AS objectname, schemaname + '.' + tablename AS fullobj FROM pg_tables
            UNION
            SELECT schemaname, 'v' AS obj_type, viewname AS objectname, schemaname + '.' + viewname AS fullobj FROM pg_views
            ) AS objs
            ,(SELECT * FROM pg_user) AS usrs
        ORDER BY fullobj
        )
    WHERE (sel = true or ins = true or upd = true or del = true or ref = true)
    and usename = '<user>'.  -- for a user filter
    and schemaname = '<schema>'. -- for a schema filter
    and objectname = '<table or view>'. -- for a table filter

Вывод будет выглядеть так

schemaname          objectname          usename sel     ins     upd     del     ref
information_schema  applicable_roles    user1   true    false   false   false   false
information_schema  check_constraints   user1   true    false   false   false   false
information_schema  column_domain_usage user1   true    false   false   false   false

Если вы хотите видеть только пользователей, имеющих доступ к определенной схеме / таблице, используйте требуемые фильтры и измените первую строку на

SELECT distinct usename 
0 голосов
/ 31 августа 2018

В PostgreSQL есть то, что называется Системными Информационными Функциями, о которых вы можете прочитать здесь: https://www.postgresql.org/docs/9.1/static/functions-info.html

Функция, которая может вас заинтересовать: has_table_privilege, которая принимает три аргумента:

user
table name,
privelege

Когда мне нужно выяснить, например, какие роли можно вставить в мою таблицу пользователей, я выполняю следующее:

SELECT rolname FROM pg_roles WHERE has_table_privilege(rolname, '<table_name>', 'INSERT')

Однако эти функции вместе с таблицами pg_roles, pg_user и другими таблицами могут предоставить вам очень подробную информацию о привилегиях.

Кроме того, вы не указали, какой тип доступа (INSERT, SELECT, DELETE), но благодаря третьему аргументу вы можете либо объединить его, либо получить список пользователей, у которых они есть.

...