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 | INHERIT | SET } { OPTION | TRUE | FALSE } ] [ 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
предоставляет членство в роли одному или нескольким другим ролям, а также модификацию опций членства SET
, INHERIT
и ADMIN
; см. Раздел 21.3 для подробностей. Членство в роли имеет значение, потому что оно потенциально позволяет каждому из ее членов получить доступ к привилегиям, предоставленным роли, а также, возможно, возможность вносить изменения в саму роль. Однако фактические предоставленные разрешения зависят от опций, связанных с предоставлением. Чтобы изменить опции существующего членства, просто укажите членство с обновленными значениями опций.
Каждый из описанных ниже параметров может быть установлен либо в
TRUE
, либо в FALSE
. Ключевое слово
OPTION
принимается как синоним
TRUE
, так что WITH ADMIN OPTION
является синонимом WITH ADMIN TRUE
. При изменении
существующего членства, пропуск параметра приводит к сохранению текущего
значения.
The ADMIN
опция позволяет участнику
в свою очередь предоставлять членство в роли другим и отзывать членство
в роли также. Без опции администратора обычные пользователи не могут
делать это. Роль не считается имеющей WITH ADMIN
OPTION
на себя. Суперпользователи базы данных могут предоставлять или отзывать
членство в любой роли у кого угодно. По умолчанию эта опция установлена в
FALSE
.
Опция INHERIT
контролирует статус наследования
нового членства; см. Раздел 21.3 для
подробностей о наследовании. Если установлено значение TRUE
,
это заставляет нового члена наследовать от предоставленной роли. Если
установлено значение FALSE
, новый член не наследует.
Если не указано при создании нового членства в роли, по умолчанию используется
атрибут наследования нового члена.
Опция SET
, если она установлена в
TRUE
, позволяет участнику переключаться на предоставленную
роль, используя
SET ROLE
команду. Если роль является косвенным членом другой роли, она может использовать
SET ROLE
для переключения на эту роль только в том случае, если существует
цепочка предоставлений, каждая из которых имеет SET TRUE
.
По умолчанию эта опция установлена в TRUE
.
Чтобы создать объект, принадлежащий другой роли, или передать владение существующим
объектом другой роли, вы должны иметь возможность SET
ROLE
для этой роли; в противном случае команды, такие как ALTER
... OWNER TO
или CREATE DATABASE ... OWNER
,
завершатся неудачей. Однако пользователь, который наследует привилегии роли, но не
имеет возможности SET ROLE
для этой роли, может получить полный доступ
к роли, манипулируя существующими объектами, принадлежащими этой роли (например, он может
переопределить существующую функцию, чтобы она действовала как троянский конь). Поэтому, если
привилегии роли должны наследоваться, но не должны быть доступны через SET ROLE
,
она не должна владеть никакими SQL-объектами.
Если указано GRANTED BY
, предоставление прав записывается как выполненное указанной ролью. Пользователь может приписать предоставление прав другой роли только в том случае, если он обладает привилегиями этой роли. Роль, записанная как предоставившая права, должна иметь ADMIN OPTION
для целевой роли, если только это не суперпользователь начальной загрузки. Когда предоставление прав записывается как выполненное не суперпользователем начальной загрузки, оно зависит от того, продолжает ли предоставившая роль обладать ADMIN OPTION
для этой роли; поэтому, если ADMIN OPTION
отзывается, зависимые предоставления прав также должны быть отозваны.
В отличие от привилегий, членство в роли не может быть предоставлено
для 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.