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 { { 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 OPTION ]
    [ 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

Особые типы прав, определенные в разделе Права.

TEMP

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

ALL PRIVILEGES

Предоставление всех прав, доступных для типа объекта. В QHB ключевое слово PRIVILEGES является необязательным, хотя оно и требуется в стандарте 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 в описании_роли.


Примечания

Для отмены прав воспользуйтесь командой 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.


См. также

REVOKE, ALTER DEFAULT PRIVILEGES