GRANT#

GRANT

GRANT

GRANT — определение прав доступа

Синтаксис

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }
    ON PARAMETER configuration_parameter [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]

GRANT role_name [, ...] TO role_specification [, ...]
    [ WITH ADMIN OPTION ]
    [ GRANTED BY role_specification ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

Описание

Команда GRANT имеет два основных варианта: один, который предоставляет привилегии на объект базы данных (таблицу, столбец, представление, внешнюю таблицу, последовательность, базу данных, обертку внешних данных, внешний сервер, функцию, процедуру, процедурный язык, большой объект, параметр конфигурации, схему, табличное пространство или тип), и один, который предоставляет членство в роли. Эти варианты похожи во многих отношениях, но достаточно различны, чтобы описываться отдельно.

Предоставление прав на объекты базы данных

Этот вариант команды GRANT предоставляет конкретные привилегии на объект базы данных одной или нескольким ролям. Эти привилегии добавляются к уже предоставленным, если таковые имеются.

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

Если указана опция WITH GRANT OPTION, получатель привилегии может передать ее другим. Без опции передачи получатель не может сделать этого. Опции передачи не могут быть предоставлены PUBLIC.

Если указано GRANTED BY, то указанный праводатель должен быть текущим пользователем. Это предложение в настоящее время присутствует в этой форме только для обеспечения совместимости с SQL.

Необходимости в предоставлении привилегий владельцу объекта (обычно пользователю, создавшему его) нет, так как владелец по умолчанию имеет все привилегии. Однако владелец может выбрать отозвать некоторые из своих привилегий для безопасности.

Право удалить объект или изменить его определение любым способом не рассматривается как предоставляемое привилегия; оно является неотъемлемым для владельца и не может быть предоставлено или отозвано. (Однако, аналогичный эффект можно достичь, предоставив или отозвав членство в роли, которая владеет объектом; см. ниже). Владелец также неявно имеет все варианты предоставления прав для объекта.

Возможные привилегии:

SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE
SET
ALTER SYSTEM

Специфические типы привилегий, определенные в Раздел 5.7.

TEMP

Альтернативное написание для TEMPORARY.

ALL PRIVILEGES

Предоставьте все привилегии, доступные для типа объекта. Ключевое слово PRIVILEGES является необязательным в Tantor SE, хотя оно требуется в строгом SQL.

Синтаксис FUNCTION работает для обычных функций, агрегатных функций и оконных функций, но не для процедур; используйте PROCEDURE для них. В качестве альтернативы используйте ROUTINE, чтобы ссылаться на функцию, агрегатную функцию, оконную функцию или процедуру независимо от их точного типа.

Существует также возможность предоставления привилегий на все объекты одного типа в одной или нескольких схемах. В настоящее время эта функциональность поддерживается только для таблиц, последовательностей, функций и процедур. ALL TABLES также влияет на представления и внешние таблицы, так же, как и команда GRANT для конкретного объекта. ALL FUNCTIONS также влияет на агрегатные и оконные функции, но не на процедуры, снова так же, как и команда GRANT для конкретного объекта. Используйте ALL ROUTINES, чтобы включить процедуры.

GRANT на роли

Этот вариант команды GRANT предоставляет членство в роли одной или нескольких других ролей. Членство в роли имеет значение, потому что оно передает привилегии, предоставленные роли, каждому из ее членов.

Если указана опция WITH ADMIN OPTION, то член может в свою очередь предоставлять членство в роли другим пользователям и отзывать членство в роли. Без опции администратора обычные пользователи не могут делать этого. Роль не считается обладающей опцией WITH ADMIN OPTION для самой себя. Суперпользователи базы данных могут предоставлять или отзывать членство в любой роли любому пользователю. Роли, имеющие привилегию CREATEROLE, могут предоставлять или отзывать членство в любой роли, которая не является суперпользователем.

Если указано GRANTED BY, разрешение записывается как выполненное указанной ролью. Эту опцию могут использовать только суперпользователи базы данных, за исключением случаев, когда она указывает на ту же роль, выполняющую команду.

В отличие от привилегий, членство в роли не может быть предоставлено для PUBLIC. Обратите также внимание, что эта форма команды не позволяет использовать шумовое слово GROUP в role_specification.

Примечания

Команда REVOKE используется для отзыва привилегий доступа.

С версии PostgreSQL 8.1 концепции пользователей и групп были объединены в единый вид сущности, называемой ролью. Поэтому больше не нужно использовать ключевое слово GROUP для определения, является ли правополучатель разрешения пользователем или группой. Команда все еще позволяет использовать GROUP, но это лишнее слово.

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

Когда не владелец объекта пытается предоставить привилегии GRANT на объект, команда не выполнится, если у пользователя вообще нет привилегий на объект. Пока есть доступная привилегия, команда будет выполняться, но будут предоставлены только те привилегии, для которых у пользователя есть опции предоставления. Формы GRANT ALL PRIVILEGES выдадут предупреждающее сообщение, если нет опций предоставления, в то время как другие формы выдадут предупреждающее сообщение, если нет опций предоставления для любой из привилегий, явно указанных в команде. (В принципе, эти утверждения также применимы к владельцу объекта, но поскольку владелец всегда считается имеющим все опции предоставления, такие случаи никогда не могут возникнуть).

Важно отметить, что суперпользователи базы данных имеют доступ ко всем объектам независимо от настроек привилегий объектов. Это сравнимо с правами пользователя root в системе Unix. Как и с пользователем root, неразумно работать в качестве суперпользователя, если это необходимо.

Если суперпользователь решает выполнить команду GRANT или REVOKE, команда выполняется так, как если бы она была выполнена владельцем затронутого объекта. В частности, привилегии, предоставленные с помощью такой команды, будут выглядеть так, будто они были предоставлены владельцем объекта. (Для членства в роли, членство будет выглядеть так, будто оно было предоставлено самой ролью, содержащей его).

GRANT и REVOKE также могут выполняться ролью, которая не является владельцем объекта, но является членом роли, которая владеет объектом, или является членом роли, которая имеет привилегии WITH GRANT OPTION на объекте. В этом случае привилегии будут записаны как предоставленные ролью, которая фактически владеет объектом или имеет привилегии WITH GRANT OPTION. Например, если таблица t1 принадлежит роли g1, в которой является членом роль u1, то u1 может предоставить привилегии на t1 роли u2, но эти привилегии будут выглядеть как предоставленные непосредственно ролью g1. Любой другой член роли g1 может их отозвать позже.

Если роль, выполняющая команду GRANT, обладает необходимыми привилегиями косвенно через несколько путей членства в ролях, не определено, какая из ролей будет записана как осуществившая предоставление привилегий. В таких случаях рекомендуется использовать команду SET ROLE для перехода в конкретную роль, от имени которой вы хотите выполнить команду GRANT.

Дача разрешений на таблицу не автоматически распространяет права на любые последовательности, используемые таблицей, включая последовательности, связанные с колонками типа SERIAL. Права на последовательности должны быть установлены отдельно.

См. Раздел 5.7 для получения дополнительной информации о конкретных типах привилегий, а также о том, как проверить привилегии объектов.

Примеры

Предоставить привилегию на вставку всем пользователям для таблицы films:

GRANT INSERT ON films TO PUBLIC;

Предоставьте пользователю manuel все доступные привилегии на представление kinds:

GRANT ALL PRIVILEGES ON kinds TO manuel;

Обратите внимание, что хотя вышеприведенная команда действительно предоставит все привилегии, если она будет выполнена суперпользователем или владельцем kinds, когда она будет выполнена кем-то другим, она предоставит только те разрешения, для которых у этого кого-то другого есть опции предоставления.

Предоставить членство в роли admins пользователю joe:

GRANT admins TO joe;

Совместимость

Согласно стандарту SQL, ключевое слово PRIVILEGES в выражении ALL PRIVILEGES является обязательным. Стандарт SQL не поддерживает установку привилегий на более чем один объект за одну команду.

Tantor SE позволяет владельцу объекта отзывать свои собственные обычные привилегии: например, владелец таблицы может сделать таблицу доступной только для чтения для себя, отзывая свои собственные привилегии INSERT, UPDATE, DELETE и TRUNCATE. Это невозможно согласно стандарту SQL. Причина в том, что Tantor SE рассматривает привилегии владельца как предоставленные им самим себе; поэтому он может их отозвать. В стандарте SQL привилегии владельца предоставляются предполагаемой сущностью _SYSTEM. Не являясь _SYSTEM, владелец не может отозвать эти права.

Согласно стандарту SQL, опции предоставления прав могут быть предоставлены PUBLIC; PostgreSQL поддерживает только предоставление опций предоставления прав ролям.

Согласно стандарту SQL, опция GRANTED BY позволяет указывать только CURRENT_USER или CURRENT_ROLE. Остальные варианты являются расширениями PostgreSQL.

Стандарт SQL предусматривает наличие привилегии USAGE для других типов объектов: наборы символов, сопоставления, переводы.

В стандарте SQL последовательности имеют только привилегию USAGE, которая контролирует использование выражения NEXT VALUE FOR, эквивалентного функции nextval в PostgreSQL. Привилегии SELECT и UPDATE для последовательностей являются расширениями PostgreSQL. Применение привилегии USAGE последовательности к функции currval также является расширением PostgreSQL (как и сама функция).

Привилегии на базах данных, табличных пространствах, схемах, языках и параметрах конфигурации являются расширениями Tantor SE.