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 | INHERIT | SET } { OPTION | TRUE | FALSE } ]
    [ 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 предоставляет членство в роли одному или нескольким другим ролям, а также модификацию опций членства 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.