GRANT
GRANT — определить права доступа
Синтаксис
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] имя_таблицы [, ...]
| ALL TABLES IN SCHEMA имя_схемы [, ...] }
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( имя_столбца [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( имя_столбца [, ...] ) }
ON [ TABLE ] имя_таблицы [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE имя_последовательности [, ...]
| ALL SEQUENCES IN SCHEMA имя_схемы [, ...] }
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE имя_базы_данных [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN имя_домена [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER имя_обертки_сторонних_данных [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER имя_сервера [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } имя_подпрограммы [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA имя_схемы [, ...] }
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE имя_языка [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT oid_большого_объекта [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }
ON PARAMETER параметр_конфигурации [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA имя_схемы [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE имя_табличного_пространства [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE имя_типа [, ...]
TO описание_роли [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY описание_роли ]
GRANT имя_роли [, ...] TO описание_роли [, ...]
[ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ]
[ GRANTED BY описание_роли ]
где описанием_роли может быть:
[ GROUP ] имя_роли
| PUBLIC
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER
Описание
Команда GRANT имеет два основных варианта: один, предоставляющий права на
объекты базы данных (таблицу, столбец, представление, стороннюю таблицу,
последовательность, базу данных, обертку сторонних данных, сторонний сервер,
функцию, процедуру, процедурный язык, большой объект, параметр конфигурации,
схему, табличное пространство или тип), и второй, предоставляющий членство в
роли. Эти варианты во многом похожи, но имеют достаточно отличий, чтобы быть
описанными отдельно.
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
Особые типы прав, определенные в разделе Права:
TEMP
Альтернативное написание для TEMPORARY.
ALL PRIVILEGES
Предоставление всех прав, доступных для типа объекта. В QHB
ключевое слово PRIVILEGES является необязательным, хотя оно и требуется в
стандарте SQL.
Синтаксис FUNCTION работает для простых, агрегатных и оконных функций, но не для процедур; для последних предназначен синтаксис PROCEDURE. В качестве альтернативы используйте ROUTINE, чтобы ссылаться на функцию, агрегатную функцию, оконную функцию или процедуру независимо от ее точного типа.
Кроме того, существует возможность предоставления прав на все объекты одного типа
в рамках одной или нескольких схем. В настоящее время эта функциональность
поддерживается только для таблиц, последовательностей, функций и процедур.
ALL TABLES также воздействует на представления и сторонние таблицы, аналогично
команде GRANT для конкретного объекта. ALL FUNCTIONS также воздействует на
агрегатные и оконные функции, но не на процедуры — опять же аналогично GRANT
для конкретного объекта. Чтобы включить сюда процедуры, воспользуйтесь формой
ALL ROUTINES.
GRANT для ролей
Этот вариант команды GRANT предоставляет членство в роли для одной или нескольких
других ролей, а также модификацию параметров членства SET, INHERIT и
ADMIN; подробную информацию см. в разделе Членство в роли. Членство в роли
имеет большое значение, поскольку потенциально дает всем участникам роли доступ
к предоставленным ей правам, а также потенциальную возможность изменять саму эту
роль. Однако фактические выданные права зависят от параметров, связанных с их
предоставлением. Чтобы изменить такие параметры существующего членства, просто
укажите это членство с измененными значениями параметров.
В каждом из описанных ниже параметров можно установить значение TRUE или FALSE. Ключевое слово OPTION принимается как синоним TRUE, так что WITH ADMIN OPTION является синонимом WITH ADMIN TRUE. При изменении существующего членства исключение параметра приводит к сохранению текущего значения.
Параметр ADMIN позволяет члену в свою очередь предоставлять членство в этой роли другим ролям, равно как и отзывать его. Без атрибута администратора обычные пользователи не могут этого делать. Считается, что роль не имеет права WITH ADMIN OPTION для самой себя. Суперпользователи базы данных могут предоставлять или отзывать членство в любой роли у любого пользователя. По умолчанию этот параметр имеет значение FALSE.
Параметр INHERIT управляет статусом наследования нового членства; подробную информацию о наследовании см. в разделе Членство в роли. При значении TRUE новый член наследует от предоставленной роли. При значении FALSE новый член от нее не наследует. Если при создании нового членства в роли этот параметр не указан, по умолчанию используется атрибут наследования нового члена.
При значении TRUE параметр SET позволяет члену менять предоставленную ему
роль с помощью команды 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 в описании_роли.
Примечания
Для отмены прав воспользуйтесь командой REVOKE.
В QHB понятия пользователей и групп были объединены в единый вид сущности, называемый ролью. Поэтому больше нет необходимости использовать ключевое слово 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. Разрешения на последовательности должны быть установлены отдельно.
Дополнительную информацию о конкретных типах прав, а также о том, как просмотреть права на объекты, см. в разделе Права.
Примеры
Разрешить всем пользователям добавлять записи в таблицу 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 не поддерживает установку в одной команде прав на более чем один объект.
QHB позволяет владельцу объекта отозвать свои обычные права: например, владелец таблицы может сделать ее доступной ему же только для чтения, отозвав свои собственные права INSERT, UPDATE, DELETE и TRUNCATE. В соответствии со стандартом SQL, это невозможно. Причина заключается в том, что QHB рассматривает права владельца как предоставленные им самому себе, поэтому владелец также может и отозвать их. В стандарте SQL права владельца предоставляются предполагаемой сущностью «_SYSTEM». Так как владелец объекта отличается от «_SYSTEM», лишить себя этих прав он не может.
В соответствии со стандартом SQL, право с возможностью передачи можно дать группе PUBLIC; QHB поддерживает предоставление возможности передачи прав только ролям.
Стандарт SQL позволяет указывать в параметре GRANTED BY только значения CURRENT_USER или CURRENT_ROLE. Остальные варианты являются расширениями QHB.
Стандарт SQL предусматривает распространение права USAGE на другие виды объектов: наборы символов, правила сортировки, преобразования.
В стандарте SQL последовательности имеют только право USAGE, которое контролирует использование выражения NEXT VALUE FOR, равнозначное функции nextval в QHB. Права SELECT и UPDATE для последовательностей являются расширениями QHB. Применение права USAGE на последовательности к функции currval также относится к расширениям QHB (как и сама функция).
Права на базы данных, табличные пространства, схемы, языки и параметры конфигурации являются расширениями QHB.