GRANT#
GRANT
GRANT — определение прав доступа
Синтаксис
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }routine_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANTrole_name
[, ...] TOrole_specification
[, ...] [ WITH ADMIN OPTION ] [ GRANTED BYrole_specification
] whererole_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.