Задание прав. команда grant

Создание пользователя само по себе не дает ему никаких прав на доступ к объектам базы данных.

Права доступа предоставляются командой GRANT. При этом нужно помнить, что пользователь, выдающий команду GRANT, может передать или, если это вам больше нравится делегировать другим пользователям только те права, которыми он обладает сам.

GRANT устанавливает права на объекты базы данных пользователям, ролям или другим объектам базы данных. Когда объект создается, права на него имеет только его создатель и только он может выдавать права другим пользователям или объектам.

Для доступа к таблице или обзору пользователь или объект нуждается в правах на SELECT, INSERT, UPDATE, DELETE или REFERENCES. Все права могут быть даны опцией ALL.

Для вызова процедуры в приложении пользователь должен иметь права на EXECUTE.

Пользователи могут получить разрешение выдавать права другим пользователям передачей прав по списку , который задается оп цией WITH GRANT OPTION. Пользователь может выдавать другим только те права, которыми располагает сам.

Права могут быть даны всем пользователям опцией PUBLIC на месте списка имен пользователей. Указание опции PUBLIC распространяется только на пользователей, а не на объекты базы данных.

Перечень прав приведен в табл. 8.5.

Таблица 8.5. Перечень прав

Права могут быть ликвидированы пользователем, выдавшим их, через команду REVOKE. Если права были выданы с помощью ALL, то и ликвидированы они могут быть только в режиме ALL, если права были выданы с помощью PUBLIC, то и ликвидированы они могут быть только в режиме PUBLIC.

Синтаксис:

GRANT {all /PRIVILEGES] / LJST_} ON {TABLE ]

{tablename / viewname}

TO { / LIST_ / GROUP UNIX_group^

/EXECUTE ON PROCEDURE procname TO

{LIST_ LIST_ {WITH GRANT OPTION./}

ILJST_rolename TO {PUBLIC

/ LIST_ {WITH ADKIN OPTION] } ;

;;= SELECT / DELETE / INSERT / UPDATE [ (LIST_col) ] j REFERENCES ПЬТ5Т_со1) ]

; . = PROCEDURE procname j TRIGGER trigname j VIEW viewname / PUBLIC

;:= username I rolename

:;= username

Таблица 8.6. Описание синтаксических элементов команды GRANT

Аргумент Описание
privilege Имя предоставленного права. Допустимые значения: SELECT, DELETE, INSERT, UPDATE, REFERENCES
Col Имя столбца, на который выдаются права.
Tablename Имя существующей таблицы, на которую распространяются права
Viewname Имя существующего обзора, на который распространяются права
Имя существующего объекта базы (процедуры, обзора, триггера), на который распространяются права
username Имя пользователя, которому передаются права
WITH GRANT OPTION Передает права на передачу прав пользователям, перечисленным в списке LIST_
rolename Имя существующей роли, созданной командой CREATE ROLE
Пользователь, которому передаются права роли. Список пользователей должен быть задан в isc4.gdb (создан, например утилитой IBConsole)
GROUP unix_group Имя группы в UNIX, заданной в /etc/group

Следующая команда передает права пользователю на SELECT и DELETE. Опция WITH GRANT OPTION дает права на их дальнейшую передачу.

Пример 8.5

А эта команда дает право на выполнение процедуры другой процедуре и пользователю.

Пример 8.6

GRANT EXECUTE ON PROCEDURE PAUTHOR TO PROCEDURE PBOOKAUTHOR, MISHA;

В данном случае передача прав процедуре PBOOKAUTHOR в нашей базе бессмысленна, поскольку она просто не использует процедуру PAUTHOR, но синтаксически она вполне корректна.

Следующая команда по содержанию полностью аналогична примеру 8.5., но ориентирована на использование внедренного SQL.

Пример 8.7 EXEC SQL

GRANT SELECT, DELETE ON TBOOK TO MISHA WITH GRANT OPTION;

Ликвидацияправ. Команда REVOKE

REVOKE ликвидирует права доступа к объектам базы данных. Права -это действия с объектом, которые разрешены пользователю. SQL-права описаны в табл. 8.7.

Отметим некоторые ограничения при использовании команды REVOKE. Ликвидировать права может только тот пользователь, кто их выдал. Одному пользователю могут быть переданы одни и те же права на объект базы данных от любого числа разных пользователей. Команда REVOKE влечет за собой лишение выданных ранее именно этим пользователем прав. Права, выданные всем пользователям опцией PUBLIC, могут быть ликвидированы командой REVOKE только с опцией PUBLIC. Синтаксис:

REVOKE username / PUBLIC :;= /"USER7 username

Следующая команда ликвидирует у пользователя права на удаление из таблицы (см. пример 8.5, в этом случае права на чтение у него остаются).

Пример 8.8

REVOKE DELETE ON ТВООК FROM MISHA;

А эта команда отменяет право на выполнение процедуры другой процедуре и пользователю (см. выделение соответствующих прав в примере 8.6)

REVOKE .EXECUTE ON PROCEDURE PAUTHOR FROM PROCEDURE PBOOKAUTHOR, MISHA;

Команды DCL используются для обеспечения безопасности баз данных в среде с несколькими базами данных пользователя. Два типа команд DCL являются предоставлять и отзывать. Только администратор базы данных или владельца объекта базы данных может предоставить / удалить привилегии на объект базы данных.

SQL GRANT Command

SQL GRANT является команда используется для предоставления доступа или привилегии на объекты базы данных для пользователей.

Синтаксис команды GRANT является:

GRANT privilege_name
ON object_name
TO {user_name |PUBLIC |role_name}
;

  • PRIVILEGE_NAME это право доступа или привилегия предоставляется пользователю. Некоторые из прав доступа, ALL, ВЫПОЛНИТЬ и SELECT.
  • object_name это имя объекта базы данных, как таблицы, представления, и хранимая процедура ПОСЛЕДОВАТЕЛЬНОСТИ.
  • user_name
  • user_name это имя пользователя, которому доступ право быть само собой разумеющееся.
  • ОБЩЕСТВЕННОЕ используется для предоставления прав доступа ко всем пользователям.
  • РОЛИ представляют собой набор привилегий сгруппированы вместе.
  • WITH GRANT OPTION - Позволяет пользователю предоставить права доступа другим пользователям.

Например: Сотрудник ГРАНТ НА ​​ВЫБОР ДЛЯ user1; Эта команда предоставляет разрешение SELECT, на столе сотрудника на user1.You следует использовать с опцией GRANT осторожно, потому что, например, если вы предоставите SELECT, привилегию на таблице сотрудников к user1, используя опцию WITH GRANT, то user1 может предоставить привилегию SELECT, таблицы сотрудника к другому пользователя, такие как user2 и т.д. Позже, если вы отзывать привилегию SELECT, работника от user1, по-прежнему user2 будет иметь привилегию SELECT, таблицы сотрудников.

SQL REVOKE Команда:

Команда REVOKE удаляет пользовательские права доступа или привилегии для объектов базы данных.

Синтаксис команды REVOKE является:

REVOKE privilege_name
ON object_name
FROM {user_name |PUBLIC |role_name}

Например: КЕУОКЕ ВЫБРАТЬ ВКЛ сотруднику user1; Эта команда будет отзывать SELECT, привилегию на столе сотрудника из user1.When вы REVOKE SELECT, привилегию на столе от пользователя, пользователь не сможет больше выбора данных из этой таблицы. Тем не менее, если пользователь получил привилегии SELECT, на этом столе из более чем одного пользователей, он / она может выбрать из этой таблицы, пока каждый, кто получил разрешение не отзовет его. Вы не можете отзывать привилегии, если они изначально не были предоставлены Вами.

Привилегии и Роли:

Привилегии: Права доступа определяет права доступа, предоставляемые пользователю на объект базы данных. Есть два типа привилегий.

привилегии 1) Системные - Это позволяет пользователю создавать, изменять или удалять объекты базы данных.
2) Привилегии объектов - Это позволяет пользователю ВЫПОЛНИТЬ, SELECT, INSERT, UPDATE или DELETE данные из объектов базы данных, к которым применяются льготы.

Мало создать системные привилегии, перечислены ниже:

System Privileges Description
CREATE object allows users to create the specified object in their own schema.
CREATE ANY object allows users to create the specified object in any schema.

Вышеуказанные правила также применяются для Альтера и DROP системные привилегии.

Мало кто из привилегий объектов перечислены ниже:

Object Privileges Description
INSERT allows users to insert rows into a table.
SELECT allows users to select data from a database object.
UPDATE allows user to update data in a table.
EXECUTE allows user to execute a stored procedure or a function.

Роли: Роли представляют собой набор привилегий или прав доступа. Когда есть много пользователей в базе данных становится трудно предоставлять или отменять привилегии для пользователей. Поэтому, если вы определили роли, вы можете предоставить или отменить привилегии для пользователей, тем самым автоматически предоставления или отмены льгот. Вы можете либо создавать роли или использовать системные роли предопределенных оракула.

Некоторые из привилегий, предоставленных системных ролей, как указано ниже:

System Role Privileges Granted to the Role
CONNECT CREATE TABLE, CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE, CREATE SESSION etc.
RESOURCE CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER etc. The primary usage of the RESOURCE role is to restrict access to database objects.
DBA ALL SYSTEM PRIVILEGES

Создание ролей:

Синтаксис для создания роли является:

CREATE ROLE role_name
;

Например: Чтобы создать роль под названием "разработчик" с паролем как "PWD", код будет выглядеть следующим образом

CREATE ROLE testing
;

Это легче предоставлять или отменять привилегии для пользователей через роли, а не присвоения привилегий непосредственно каждому пользователю. Если роль идентифицируется с помощью пароля, а затем, когда вы предоставить или отменить привилегии для роли, вы обязательно должны идентифицировать его с паролем.

Мы можем предоставить или отменить привилегию роли, как показано ниже.

Например: Чтобы предоставить привилегию CREATE TABLE пользователю посредством создания роли тестирования:

Во-первых, создать тестирование роли

CREATE ROLE testing

Во-вторых, предоставить привилегию CREATE TABLE для тестирования роли. Вы можете добавить дополнительные привилегии для этой роли.

GRANT CREATE TABLE TO testing;

В-третьих, предоставить пользователю роль.

GRANT testing TO user1;

Чтобы отменить привилегию CREATE TABLE от тестирования РОЛИ, вы можете написать:

REVOKE CREATE TABLE FROM testing;

Синтаксис уронить роль из базы данных, как показано ниже:

DROP ROLE role_name;

Например: Чтобы удалить роль под названием разработчик, вы можете написать.

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name "password"] [, user_name ...] ] ] ] ] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]

GRANT включен в MySQL начиная с версии 3.22.11 и выше. В более ранних версиях MySQL оператор GRANT ничего не выполняет.

Команды GRANT и REVOKE позволяют системным администраторам создавать пользователей MySQL, а также предоставлять права пользователям или лишать их прав на четырех уровнях привилегий:

Глобальный уровень Глобальные привилегии применяются ко всем базам данных на указанном сервере. Эти привилегии хранятся в таблице mysql.user . Уровень базы данных Привилегии базы данных применяются ко всем таблицам указанной базы данных. Эти привилегии хранятся в таблицах mysql.db и mysql.host . Уровень таблицы Привилегии таблицы применяются ко всем столбцам указанной таблицы. Эти привилегии хранятся в таблице mysql.tables_priv . Уровень столбца Привилегии столбца применяются к отдельным столбцам указанной таблицы. Эти привилегии хранятся в таблице mysql.columns_priv .

Если привилегии предоставляются пользователю, которого не существует, то этот пользователь создается. Чтобы просмотреть примеры работы команды GRANT , см. раздел section 4.3.5 Добавление новых пользователей в MySQL .

В таблице приведен список возможных значений параметра priv_type для операторов GRANT и REVOKE:

ALL Задает все простые привилегии, кроме WITH GRANT OPTION
ALTER Разрешает использование ALTER TABLE
CREATE Разрешает использование CREATE TABLE
CREATE TEMPORARY TABLES Разрешает использование CREATE TEMPORARY TABLE
DELETE Разрешает использование DELETE
DROP Разрешает использование DROP TABLE .
EXECUTE Разрешает пользователю запускать хранимые процедуры (для MySQL 5.0)
FILE Разрешает использование SELECT ... INTO OUTFILE и LOAD DATA INFILE .
INDEX Разрешает использование CREATE INDEX and DROP INDEX
INSERT Разрешает использование INSERT
LOCK TABLES Разрешает использование LOCK TABLES на таблицах, для которых есть привилегия SELECT .
PROCESS Разрешает использование SHOW FULL PROCESSLIST
REFERENCES Зарезервировано для использования в будущем
RELOAD Разрешает использование FLUSH
REPLICATION CLIENT Предоставляет пользователю право запрашивать местонахождение головного и подчиненных серверов.
REPLICATION SLAVE Необходимо для подчиненных серверов при репликации (для чтения информации из бинарных журналов головного сервера).
SELECT Разрешает использование SELECT
SHOW DATABASES SHOW DATABASES выводит все базы данных.
SHUTDOWN Разрешает использование mysqladmin shutdown
SUPER Позволяет установить одно соединение (один раз), даже если достигнуто значение max_connections, и запускать команды CHANGE MASTER , KILL thread , mysqladmin debug , PURGE MASTER LOGS и SET GLOBAL
UPDATE Разрешает использование UPDATE
USAGE Синоним для ``без привилегий"".

Значение USAGE можно задавать, если необходимо создать пользователя без привилегий.

Привилегии CREATE TEMPORARY TABLES , EXECUTE , LOCK TABLES , REPLICATION ... , SHOW DATABASES и SUPER являются новыми для версии 4.0.2. Чтобы воспользоваться этими новыми привилегиями после обновления до версии 4.0.2, необходимо запустить скрипт mysql_fix_privilege_tables .

В боле старых версиях MySQL привилегия PROCESS предоставляет такие же права, как и новая привилегия SUPER .

Чтобы лишить пользователя привилегий, предоставленных командой GRANT , воспользуйтесь значением priv_type в GRANT OPTION:

Mysql> REVOKE GRANT OPTION ON ... FROM ...;

Для таблицы можно указать только следующие значения priv_type: SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , GRANT , I NDEX и ALTER .

Для столбца можно указать только следующие значения priv_type (при использовании оператора column_list): SELECT , INSERT и UPDATE .

Глобальные привилегии можно задать, воспользовавшись синтаксисом ON *.* , а привилегии базы данных - при помощи синтаксиса ON db_name.* . Если указать ON * при открытой текущей базе данных, то привилегии будут заданы для этой базы данных. (Предупреждение : если указать ON * при отсутствии открытой текущей базы данных, это повлияет на глобальные привилегии!)

С тем, чтобы можно было определять права пользователям с конкретных компьютеров, в MySQL обеспечивается возможность указывать имя пользователя (user_name) в форме . Если необходимо указать строку user , в которой содержатся специальные символы (такие как `-") или строку host , в которой содержатся специальные или групповые символы (такие как `%"), можно заключить имя удаленного компьютера или пользователя в кавычки (например, "test-user"@"test-hostname").

В имени удаленного компьютера также можно указывать групповые символы. Например, "%.loc.gov" относится к user всех удаленных компьютеров домена loc.gov , а "144.155.166.%" относится к user всех удаленных компьютеров подсети 144.155.166 класс C.

Простая форма user является синонимом для "%" .

В MySQL не поддерживаются групповые символы в именах пользователей. Анонимные пользователи определяются вставкой записей User="" в таблицу mysql.user или созданием пользователя с пустым именем при помощи команды GRANT .

Примечание : если анонимным пользователям разрешается подсоединяться к серверу MySQL, необходимо также предоставить привилегии всем локальным пользователям как , поскольку в противном случае при попытке пользователя зайти в MySQL с локального компьютера в таблице mysql.user будет использоваться вход для анонимного пользователя!

Чтобы проверить, происходит ли подобное на вашем компьютере, выполните следующий запрос:

Mysql> SELECT Host,User FROM mysql.user WHERE User="";

На данный момент команда GRANT поддерживает имена удаленных компьютеров, таблиц, баз данных и столбцов длиной не более 60 символов. Имя пользователя должно содержать не более 16 символов.

Привилегии для таблицы или столбца формируются при помощи логического оператора OR из привилегий каждого из четырех уровней. Например, если в таблице mysql.user указано, что у пользователя есть глобальная привилегия SELECT , эта привилегия не отменяется на уровне базы данных, таблицы или столбца.

Привилегии для столбца могут быть вычислены следующим образом:

Глобальные привилегии OR (привилегии базы данных AND привилегии удаленного компьютера) OR привилегии таблицы OR привилегии столбца

В большинстве случаев права пользователя определяются только на одном уровне привилегий, поэтому обычно эта процедура не настолько сложна, как описано выше. Подробная информация о последовательности действий проверки привилегий представлена в разделе section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL .

Если привилегии предоставляются сочетанию пользователь/удаленный компьютер, которое отсутствует в таблице mysql.user , то в последнюю добавляется запись, которая остается в таблице до тех пор, пока не будет удалена при помощи команды DELETE . Иначе говоря, команда GRANT может создавать записи user в таблице, но команда REVOKE не может их удалить. Это необходимо делать при помощи команды DELETE .

Если у вас привилегии для базы данных, то при необходимости в таблице mysql.db создается запись. Данная запись удаляется после удаления всех привилегий для этой базы данных командой REVOKE .

Если у пользователя нет никаких привилегий для таблицы, то таблица не отображается, когда пользователь запрашивает список таблиц (например, при помощи оператора SHOW TABLES).

Оператор WITH GRANT OPTION предоставляет пользователю возможность наделять других пользователей любыми привилегиями, которые он сам имеет на указанном уровне привилегий. При предоставлении привилегии GRANT необходимо проявлять осмотрительность, так как два пользователя с разными привилегиями могут объединить свои привилегии!

Параметры MAX_QUERIES_PER_HOUR # , MAX_UPDATES_PER_HOUR # и MAX_CONNECTIONS_PER_HOUR # являются новыми в MySQL версии 4.0.2. Эти параметры ограничивают количество запросов, обновлений и входов, которые пользователь может осуществить в течение одного часа. Если установлено значение 0 (принято по умолчанию), то это означает, что для данного пользователя нет ограничений. See section .

Нельзя предоставить другому пользователю привилегию, которой нет у вас самого. Привилегия GRANT позволяет предоставлять только те привилегии, которыми вы обладаете.

Учтите, что если пользователю назначена привилегия GRANT на определенном уровне привилегий, то все привилегии, которыми этот пользователь уже обладает (или которые будут ему назначены в будущем!) на этом уровне, также могут назначаться этим пользователем. Предположим, пользователю назначена привилегия INSERT в базе данных. Если потом в базе данных назначить привилегию SELECT и указать WITH GRANT OPTION , пользователь сможет назначать не только привилегию SELECT , но также и INSERT . Если затем в базе данных предоставить пользователю привилегию UPDATE , пользователь сможет после этого назначать INSERT , SELECT и UPDATE .

Не следует назначать привилегии ALTER обычным пользователям. Это дает пользователю возможность разрушить систему привилегий путем переименования таблиц!

Обратите внимание на то, что если используются привилегии для таблицы или столбца даже для одного пользователя, сервер проверяет привилегии таблиц и столбцов для всех пользователей, и это несколько замедляет работу MySQL.

При запуске mysqld все привилегии считываются в память. Привилегии базы данных, таблицы и столбца вступают в силу немедленно, а привилегии уровня пользователя - при следующем подсоединении пользователя. Изменения в таблицах назначения привилегий, которые осуществляются при помощи команд GRANT и REVOKE , обрабатываются сервером немедленно. Если изменять таблицы назначения привилегий вручную (используя команды INSERT , UPDATE и т.д.), необходимо запустить оператор FLUSH PRIVILEGES или mysqladmin flush-privilege s, чтобы указать серверу на необходимость перезагрузки таблиц назначения привилегий. See section 4.3.3 Когда изменения в привилегиях вступают в силу .

Наиболее значительные отличия команды GRANT версий ANSI SQL и MySQL следующие:

  • В MySQL привилегии назначаются для сочетания имя пользователя + удаленный компьютер, а не только для имени пользователя.
  • В ANSI SQL отсутствуют глобальные привилегии и привилегии уровня базы данных, и ANSI SQL поддерживает не все типы привилегий MySQL. В свою очередь, в MySQL отсутствует поддержка привилегий ANSI SQL TRIGGER , EXECUTE или UNDER .
  • Структура привилегий ANSI SQL является иерархической. Если удалить пользователя, то все назначенные этому пользователелю привилегии будут отменены. В MySQL назначенные привилегии не отменяются автоматически, их при необходимости требуется удалять самостоятельно.
  • В MySQL пользователь может применять к таблице оператор INSERT при наличии у него привилегии INSERT только для нескольких столбцов в этой таблице. Столбцы, для которых отсутствует привилегия INSERT , будут установлены в свои значения, принятые по умолчанию. В ANSI SQL требуется наличие привилегии INSERT для всех столбцов.
  • При удалении таблицы в ANSI SQL все привилегии для этой таблицы будут отменены. Если отменить привилегию в ANSI SQL, то все привилегии, которые были назначены на основе этой привилегии, также будут отменены. В MySQL привилегии могут удаляться только при помощи команды REVOKE или путем изменения таблиц назначения привилегий MySQL.

Чтобы ознакомиться с описанием использования REQUIRE , см. раздел See section 4.3.9 Использование безопасных соединений .

User Comments

Posted by Frank Wortner [Delete ] [Edit ]

I had no problems with ld. DEC (Compaq) might
have fixed ld in a patch kit. You might want to
install the latest patch kit for your Digital Unix
(Tru64 Unix) before building MySQL. Patch kits
are available at
href=http://ftp.support.compaq.com/public/unix/ >
http://ftp.support.compaq.com/public/unix/

Posted by on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

For source installations, these instructions refer to the directory structure presuming "usr/local" was used (default) with configure. But the preceding page"s instructions (for compilation/installation) suggest you use:

./configure --prefix=/usr/local/mysql

To be consistent (and this is causing me some hassles with Perl, so it"s not purely semantic), the instructions on this page should presume /usr/local/mysql was specified as the installation directory with configure.

Posted by Linda Wright on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

This is probably the most important and least
appreciated sections of all of the mySQL
documentation for first time mySQL users. IMHO,
reading this page in conjunction with
http://www.mysql.com/doc/P/r/Privileges.html is a
must for anyone planning secure database systems
of any real sophistication.

Posted by Christopher Raymond on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

I am trying to install MySQL under OS X Public Beta. When I run the mysql_install_db script, I get an error message:

Dyld: ./bin/mysqld can"t open library: /usr/lib/libpthread.A.dylib (No such file or directory, errno = 2)
Installation of grant tables failed!

I am assuming that the script is looking for a directory that doesn"t exist because Apple has a little bit different directory naming structure. Maybe this script needs to be modified for the OS X distribution.

Can anyone help?

Posted by Mark Zieg on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

It would be nice if there was an option to log connections, but not queries.

Posted by Bennett Haselton on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

If you"re logged on as the mysql root user, without a current database selected, and you try to
grant all privileges to a user with the command:

GRANT ALL PRIVILEGES ON * TO bhaselto

Then the RELOAD, SHUTDOWN, PROCESS, FILE and GRANT will not be granted, as can be
verified by checking the "user" table of the "mysql" database. (This is presumably by design,
since these privileges can make a user "too powerful".)

Posted by DC Hill on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

NOTE: If you have granted privileges to a user on a particular database, or at any lower level than that, invoking "REVOKE ALL ON *.* FROM ;" will NOT revoke privileges at those levels. The *.* in the above statement means "global", not "all (individual) tables on all (individual) databases. That statment will ONLY revoke global privileges, as stored in the mysql.user table. You MUST revoke any more specific privileges in the same manner as they were granted, if you wish them to be removed from the privilege tables. (i.e. - GRANT ALL ON foo.* TO ; => REVOKE ALL ON foo.* FROM ;) I hope this saves some of you a little time and frustration.

Posted by Cris Perdue on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

"If you have the process privilege, you can see
all threads.
Otherwise, you can see only your own threads."

Posted by FreeBSD Forums on Saturday February 16 2002, @10:21pm [Delete ] [Edit ]

You can use phpMyAdmin web based tool to do a lot
of mySQL admin functions. href="http://www.freebsdforums.org"
>FreeBSD forums

Posted by on Monday February 25 2002, @6:03am [Delete ] [Edit ]

Verified on MySQL 3.23.36 on Red Hat Linux 7.1:
Note that if you type
use a_c;
grant select on * to ;
you will have given access to any
database matching "a_c" where the underscore is a
wildcard. (Rarely a problem, I suppose).
Rectify with
update mysql.db set db="a\_c" where db="a_c";

Posted by jan behrens on Tuesday July 9 2002, @1:31am [Delete ] [Edit ]

the aformentioned bug from DAN ELIN in x.x.41 is
apperently still valid in x.x.51,i cannot logon to a
database after GRANTing privileges and given a
password to a new user(yes, i flushed
privileges)...................only root access is possible

Posted by Dan Egli on Thursday April 4 2002, @8:33pm [Delete ] [Edit ]

There seems to be a bug in 3.23.41 using Grant.
Only root can access the mysql database, even
after using Grant to grant privs on whatever
database/table/column/ect.. you always get
permission denied, regardless.

Posted by Lars Aronsson on Saturday June 8 2002, @11:16am ["%". When I try to delete them I"m told certian database, but no global privileges, the
CREATE TEMPORARY TABLE privilege on that database
is denied.

You have to give global CREATE __and__ global
CREATE TEMPORARY TABLES to the user. IOW:
GRANT CREATE, CREATE TEMPORARY TABLES ON *.* TO
;

Needless to say, this affects security grately.

Posted by on Sunday August 25 2002, @9:17am [Delete ] [Edit ]

Temporary files are a great idea but even with
Create and Create Temproary File rights in the
user (global rights) file it still doesn"t work.
This appears to be badly designed.

Posted by Brad Bulger on Monday September 2 2002, @4:09am [Delete ] [Edit ]

It should be noted that WITH GRANT OPTION only
allows the user to pass on privileges to users who
already exist. The automagical creation of user
records does not apply - you get an error saying
that the user with the GRANT OPTION privilege does
not have access to the "mysql" database. This is
probably a good thing, but it needs to be documented.

Posted by Michael Babcock on Friday November 8 2002, @1:00pm [Delete ] [Edit ]

SHOW MASTER STATUS requires PROCESS privileges.
Other such odd combinations should be documented.

Posted by Dee Kintaudi on Thursday November 21 2002, @12:42pm [Delete ] [Edit ]

Okay I got a question and a problem with Mysql and
passwords:). I tried to use several of the options
and most of them have not worked. However one
soloution did work and I tested it out twice and it
was solid. Of course I lost the little piece of paper I
wrote it out on and I can"t seem to find this
soloution anywhere, as if it did not exist or maybe I
imagined it. The soloution that worked for me,
before I lost the little slip of paper I wrote it down on
goes something like this..... Insert into user root
Password "my password" and then something
with "Y", "Y", "Y", (about a dozen or 15 times or so)
However, I can not find this soloution anywhere can
someone help me out here?

I think it would be so nice if they just put this
throughout their documentation instead of trying to
hide it. I think this would solve many problems. Just
put password = "Y", "Y", "Y", its like their ashamed of it
or something.

Posted by AJIT DIXIT on Monday November 25 2002, @6:56am [Delete ] [Edit ]

When I work on multi-table update with root user
it works fine

When I work with non-root user I get error

Sql: update Stockists, areas set a_nm = aname
where acd = area

REVOKE - отозвать права доступа

Синтаксис

REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] имя_таблицы [, ...] | ALL TABLES IN SCHEMA имя_схемы [, ...] } FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } ( имя_столбца [, ...]) [, ...] | ALL [ PRIVILEGES ] ( имя_столбца [, ...]) } ON [ TABLE ] имя_таблицы [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE имя_последовательности [, ...] | ALL SEQUENCES IN SCHEMA имя_схемы [, ...] } FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE имя_бд [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN имя_домена [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER имя_обёртки_сторонних_данных [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER имя_сервера [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION имя_функции ([ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ]) [, ...] | ALL FUNCTIONS IN SCHEMA имя_схемы [, ...] } FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE имя_языка [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT oid_БО [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA имя_схемы [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE табл_пространство [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPE имя_типа [, ...] FROM { [ GROUP ] имя_роли | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] имя_роли [, ...] FROM имя_роли [, ...] [ CASCADE | RESTRICT ]

Описание

Команда REVOKE лишает одну или несколько ролей прав, назначенных ранее. Ключевое слово PUBLIC обозначает неявно определённую группу всех ролей.

Заметьте, что любая конкретная роль получает в сумме права, данные непосредственно ей, права, данные любой роли, в которую она включена, а также права, данные группе PUBLIC . Поэтому, например, лишение PUBLIC права SELECT не обязательно будет означать, что все роли лишатся права SELECT для данного объекта: оно сохранится у тех ролей, которым оно дано непосредственно или косвенно, через другую роль. Подобным образом, лишение права SELECT какого-либо пользователя может не повлиять на его возможность пользоваться правом SELECT , если это право дано группе PUBLIC или другой роли, в которую он включён.

Если указано GRANT OPTION FOR , отзывается только право передачи права, но не само право. Без этого указания отзывается и право, и право распоряжаться им.

Если пользователь обладает правом с правом передачи и он дал его другим пользователям, последнее право считается зависимым. Когда первый пользователь лишается самого права или права передачи и существуют зависимые права, эти зависимые права также отзываются, если дополнительно указано CASCADE ; в противном случае операция завершается ошибкой. Это рекурсивное лишение прав затрагивает только права, полученные через цепочку пользователей, которую можно проследить до пользователя, являющегося субъектом команды REVOKE . Таким образом, пользователи могут в итоге сохранить это право, если оно было также получено через других пользователей.

Когда отзывается право доступа к таблице, с ним вместе автоматически отзываются соответствующие права для каждого столбца таблицы (если такие права заданы). С другой стороны, если роли были даны права для таблицы, лишение роли таких же прав на уровне отдельных столбцов ни на что не влияет.

При лишении пользователя членства в роли GRANT OPTION меняется на ADMIN OPTION , в остальном поведение команды похожее. Заметьте также, что эта форма команды не принимает избыточное слово GROUP .

Замечания

Для просмотра прав, назначенных для существующих таблиц и столбцов, можно воспользоваться командой \dp в psql . Формат её вывода рассматривается в описании GRANT . Для других, не табличных объектов предусмотрены другие команды \d , которые могут показывать в том числе и назначенные для них права.

Пользователь может отзывать только те права, которые он дал другому непосредственно. Если, например, пользователь A дал право с правом передачи пользователю B, а пользователь B, в свою очередь, дал это право пользователю C, то пользователь A не сможет лишить этого права непосредственно C. Вместо этого, пользователь A может лишить права передачи права пользователя B и использовать параметр CASCADE , чтобы этого права по цепочке лишился пользователь C. Или же, например, если и A, и B дали одно и то же право C, то A сможет отозвать право, которое дал он, но не пользователь B, так что в результате C всё равно будет иметь это право.

Если отозвать право доступа к объекту (с помощью REVOKE) попытается не владелец объекта, команда завершится ошибкой, если пользователь не имеет никаких прав для этого объекта. Если же пользователь имеет какие-то права, команда будет выполняться, но пользователь сможет отозвать только те права, которые даны ему с правом распоряжения ими. Формы REVOKE ALL PRIVILEGES будут выдавать предупреждение, если у него вовсе нет таких прав, тогда как другие формы будут выдавать предупреждения, если пользователь не имеет права распоряжаться именно правами, указанными в команде. (В принципе, эти утверждения применимы и к владельцу объекта, но ему разрешено распоряжаться всем правами, поэтому такие ситуации невозможны.)

Если команду GRANT или REVOKE выполняет суперпользователь, эта команда выполняется так, как будто её выполняет владелец затрагиваемого объекта. Так как все права в конце концов исходят от владельца объекта (возможно, косвенно по цепочке или через право распоряжением правом), суперпользователь может отозвать все права, но это может потребовать применения режима CASCADE , как описывалось выше.

REVOKE также может быть выполнена ролью, которая не является владельцем заданного объекта, но является членом роли-владельца, либо членом роли, имеющей права WITH GRANT OPTION для этого объекта. В этом случае команда будет выполнена, как если бы её выполняла содержащая роль, действительно владеющая объектом или имеющая права WITH GRANT OPTION . Например, если таблица t1 принадлежит роли g1 , членом которой является роль u1 , то u1 может отзывать права на использование t1 , которые записаны как данные ролью g1 . В том числе это могут быть права, данные ролью u1 , а также другими членами роли g1 .

Если роль, выполняющая команду REVOKE , получила указанные права косвенно по нескольким путям членства ролей, какая именно роль будет выбрана для выполнения команды, не определено. В таких случаях рекомендуется воспользоваться командой SET ROLE и переключиться на роль, которую хочется видеть в качестве выполняющей REVOKE . Если этого не сделать, могут быть отозваны не те права, что планировалось, либо отозвать права вообще не удастся.

Примеры

Лишение группы public права добавлять данные в таблицу films:

REVOKE INSERT ON films FROM PUBLIC;

Лишение пользователя manuel всех прав для представления kinds:

REVOKE ALL PRIVILEGES ON kinds FROM manuel;

Заметьте, что на самом деле это означает «лишить всех прав, которые дал я » .

Исключение из членов роли admins пользователя joe:

REVOKE admins FROM joe;

Совместимость

Замечания по совместимости, приведённые для команды GRANT , справедливы и для REVOKE . Стандарт требует обязательного указания ключевого слова RESTRICT или CASCADE , но PostgreSQL подразумевает RESTRICT по умолчанию.

В этой главе, вы обучитесь работе с привилегиями. Как сказано в Главе 2 , SQL используется обычно в средах, которые требуют распознавания пользователей и различия между различными пользователями систем. Вообще говор, администраторы баз данных, сами создают пользователей и дают им привилегии. С другой стороны пользователи которые создают таблицы, сами имеют права на управление этими таблицами. Привилегии - это то, что определяет, может ли указанный пользователь выполнить данную команду. Имеется несколько типов привилегий, соответствующих нескольким типам операций. Привилегии даются и отменяются двум командами SQL: - GRANT (ДОПУСК) и REVOKE (ОТМЕНА). Эта глава покажет вам как эти команды используются.

ПОЛЬЗОВАТЕЛИ

Каждый пользователь в среде SQL, имеет специальное идентификационное имя или номер. Терминология везде разная, но мы выбрали (следу ANSI) ссылку на им или номер как на Идентификатор (ID) доступа. Команда, посланная в базе данных ассоциируется с определенным пользователем; или иначе, специальным Идентификатором доступа. Поскольку это относится к SQL базе данных, ID разрешения - это имя пользователя, и SQL может использовать специальное ключевое слово USER, которое ссылается к Идентификатору доступа связанному с текущей командой. Команда интерпретируется и разрешается (или запрещается) на основе информации связанной с Идентификатором доступа пользователя подавшего команду.

РЕГИСТРАЦИЯ

В системах с многочисленными пользователями, имеется некоторый вид процедуры входа в систему, которую пользователь должен выполнить чтобы получить доступ к компьютерной системе. Эта процедура определяет какой ID доступа будет связан с текущим пользователем. Обычно, каждый человек использующий базу данных должен иметь свой собственный ID доступа и при регистрации превращается в действительного пользователям. Однако, часто пользователи имеющие много задач могут регистрироваться под раз- личными ID доступа, или наоборот один ID доступа может использоваться несколькими пользователями. С точки зрения SQL нет никакой разницы между этими двум случаями; он воспринимает пользователя просто как его ID доступа. SQL база данных может использовать собственную процедуру входа в систему, или она может позволить другой программе, типа операционной системы (основная программа которая работает на вашем компьютере), обрабатывать файл регистрации и получать ID доступа из этой программы. Тем или другим способом, но SQL будет иметь ID доступа чтобы связать его с вашими действиями, а для вас будет иметь значение ключевое слово USER.

ПРЕДОСТАВЛЕНИЕ ПРИВИЛЕГИЙ

Каждый пользователь в SQL базе данных имеет набор привилегий. Это - то что пользователю разрешается делать (возможно это - файл регистрации, который может рассматриваться как минимальная привилегия). Эти привилегии могут изменяться со временем - новые добавляться, старые удаляться. Некоторые из этих привилегий определены в ANSI SQL, но имеются и дополнительные привилегии, которые являются также необходимыми. SQL привилегии как определено ANSI, не достаточны в большинстве ситуаций реальной жизни. С другой стороны, типы привилегий, которые необходимы, могут видоизменяться с видом системы которую вы используете - относительно которой ANSI не может дать никаких рекомендаций. Привилегии которые не являются частью стандарта SQL могут использовать похожий синтаксис и не полностью совпадающий со стандартом.

СТАНДАРТНЫЕ ПРИВИЛЕГИИ

SQL привилегии определенные ANSI - это привилегии объекта. Это означает что пользователь имеет привилегию чтобы выполнить данную команду только на определенном объекте в базе данных. Очевидно, что привилегии должны различать эти объекты, но система привилегии основанная исключительно на привилегиях объекта не может адресовать все что нужно SQL, как мы увидим это позже в этой главе. Привилегии объекта связаны одновременно и с пользователями и с таблица- ми. То есть, привилегия дается определенному пользователю в указанной таблице, или базовой таблице или представлении. Вы должны помнить, что пользователь создавший таблицу (любого вида), является владельцем этой таблицы.

Это означает, что пользователь имеет все привилегии в этой таблице и может передавать привилегии другим пользователям в этой таблице. Привилегии которые можно назначить пользователю:

SELECT Пользователь с этой привилегией может выполнять запросы в таблице.

INSERT Пользователь с этой привилегией может выполнять команду INSERT в таблице.

UPDATE Пользователь с этой привилегией может выполнять команду UPDATE на таблице. Вы можете ограничить эту привилегию для определенных столбцов таблицы.

DELETE Пользователь с этой привилегией может выполнять команду DELETE в таблице.

REFERENCES Пользователь с этой привилегией может определить внешний ключ, который использует один или более столбцов этой таблицы, как родительский ключ. Вы можете ограничить эту привилегию для определенных столбцов. (Смотрите Главу 19 для подробностей относительно внешнего ключа и родительского ключа.)

Кроме того, вы столкнетесь с нестандартными привилегиями объекта, такими например как INDEX (ИНДЕКС) дающим право создавать индекс в таблице, SYNONYM (СИНОНИМ) дающим право создавать синоним для объекта, который будет объяснен в Главе 23 , и ALTER (ИЗМЕНИТЬ) дающим право выполнять команду ALTER TABLE в таблице. Механизм SQL назначает пользователям эти привилегии с помощью команды GRANT.

КОМАНДА GRANT

Позвольте предположить, что пользователь Diane имеет таблицу Заказчиков и хочет позволить пользователю Adrian выполнить запрос к ней. Diane должна в этом случае ввести следующую команду:

GRANT INSERT ON Salespeople TO Diane;

Теперь Adrian может выполнить запросы к таблице Заказчиков. Без дру- гих привилегий, он может только выбрать значения; но не может выполнить любое действие, которые бы воздействовало на значения в таблице Заказчи- ков (включая использование таблицы Заказчиков в качестве родительской таблицы внешнего ключа, что ограничивает изменения которые выполнять со значением в таблице Заказчиков).

Когда SQL получает команду GRANT, он проверяет привилегии пользователя подавшего эту команду, чтобы определить допустима ли команда GRANT. Adrian самостоятельно не может выдать эту команду. Он также не может предоставить право SELECT другому пользователю: таблица еще принадлежит Diane (позже мы покажем как Diane может дать право Adrian предоставлять SELECT другим пользователям).

Синтаксис - тот же самый, что и для предоставлени других привилегий. Если Adrian - владелец таблицы Продавцов, то он может позволить Diane вводить в нее строки с помощью следующего предложения

GRANT INSERT ON Salespeople TO Diane; Теперь Diane имеет право помещать нового продавца в таблицу.

ГРУППЫ ПРИВИЛЕГИЙ, ГРУППЫ ПОЛЬЗОВАТЕЛЕЙ

Вы не должны ограничивать себя предоставлением одиночной привилегии отдельному пользователю командой GRANT. Списки привилегий или пользователей, отделяемых запятыми, являются совершенно приемлемыми. Stephen может предоставить и SELECT и INSERT в таблице Порядков для Adrian

GRANT SELECT, INSERT ON Orders TO Adrian; или и для Adrian и для Diane GRANT SELECT, INSERT ON Orders TO Adrian, Diane;

Когда привилегии и пользователи перечислены таким образом, весь спи- сок привилегий предоставляются всем указанным пользователям. В строгой ANSI интерпретации, вы не можете предоставить привилегии во многих таблицах сразу одной командой, но в некоторых реализациях это ограничение может быть ослаблено, позволяя вам указывать несколько таблиц, отделяя их запятыми, так что бы весь список привилегий мог быть предоставлен для всех указанных таблиц.

ОГРАНИЧЕНИЕ ПРИВИЛЕГИЙ НА ОПРЕДЕЛЕННЫЕ СТОЛБЦЫ

Все привилегии объекта используют один тот же синтаксис, кроме команд UPDATE и REGERNCES в которых необязательно указывать имена столбцов. Привилегию UPDATE можно предоставлять наподобие других привилегий:

GRANT UPDATE ON Salespeople TO Diane;

Эта команда позволит Diane изменять значения в любом или во всех столбцах таблицы Продавцов. Однако, если Adrian хочет ограничить Diane в изменении например комиссионных, он может ввести

GRANT UPDATE (comm) ON Salespeople TO Diane;

Другими словами, он просто должен указать конкретный столбец к которому привилегия UPDATE должна быть применена, в круглых скобках после имени таблицы. Имена многочисленных столбцов таблицы могут указываться в любом порядке, отделяемые запятыми:

GRANT UPDATE (city, comm) ON Salespeople TO Diane;

REFERENCES следует тому же самому правилу. Когда вы предоставите при- вилегию REFERENCES другому пользователю, он сможет создавать внешние ключи ссылающиеся на столбцы вашей таблицы как на родительские ключи. Подобно UPDATE, для привилегии REFERENCES может быть указан список из одного или более столбцов для которых ограничена эта привилегия. Например, Diane может предоставить Stephen право использовать таблицу Заказчиков, как таблицу родительского ключа, с помощью такой команды:

GRANT REFERENCES (cname, cnum) ON Customers TO Stephen; Эта команда дает Stephen право использовать столбцы cnum и cname, в качестве родительских ключей по отношению к любым внешним ключам в его таблицах. Stephen может контролировать то как это будет выполнено. Он может определить (cname, cnum) или, как в нашем случае(cnum, cname), как двух-столбцовый родительский ключ, совпадающий с помощью внешнего ключа с двум столбцами в одной из его собственных таблиц. Или он может создать раздельные внешние ключи чтобы ссылаться на пол индивидуально, обеспечив тем самым чтобы Diane имела принудительное присвоение роди- тельского ключа (см. Главу 19).

Не имея ограничений на номера внешних ключей он должен базироваться на этих родительских ключах, а родительские ключи различных внешних ключей - разрешены для совмещения(overlap).

Как и в случае с привилегией UPDATE, вы можете исключить список столб- цов и таким образом позволять всем без исключения столбцам быть используемыми в качестве родительских ключей. Adrian может предоставить Diane право сделать это следующей командой:

GRANT REFERENCES ON Salespeople TO Diane;

Естественно, привилегия будет пригодна для использования только в столбцах, которые имеют ограничения требуемые для родительских ключей.

ИСПОЛЬЗОВАНИЕ АРГУМЕНТОВ ALL И PUBLIC

SQL поддерживает два аргумента для команды GRANT, которые имеют специальное значение: ALL PRIVILEGES (ВСЕ ПРИВИЛЕГИИ) или просто ALL и PUBLIC (ОБЩИЕ). ALL используется вместо имен привилегий в команде GRANT чтобы отдать все привилегии в таблице. Например, Diane может дать Stephen весь набор привилегий в таблице Заказчиков с помощью такой команды:

GRANT REFERENCES ON Salespeople TO Diane;

(привилегии UPDATE и REFERENCES естественно применяются ко всем столбцам.) А это другой способ высказать ту же мысль:

GRANT ALL ON Customers TO Stephen;

PUBLIC - больше похож на тип аргумента - захватить все (catch-all), чем на пользовательскую привилегию. Когда вы предоставляете привилегии для публикации, все пользователи автоматически их получают. Наиболее часто, это применяется для привилегии SELECT в определенных базовых таблицах или представлениях которые вы хотите сделать доступными для любого пользователя. Чтобы позволить любому пользователю видеть таблицу Порядков, вы, например, можете ввести следующее:

GRANT SELECT ON Orders TO PUBLIC;

Конечно, вы можете предоставить любые или все привилегии обществу, но это видимо нежелательно. Все привилегии за исключением SELECT позволяют пользователю изменять (или, в случае REFERENCES, ограничивать) содержание таблицы. Разрешение всем пользователям изменять содержание ваших таблиц вызовет проблему.

Даже если вы имеете небольшую компанию, и в ней работают все ваши текущие пользователи способные выполнять команды модификации в данной таблице, было бы лучше предоставить привилегии каждому пользователю индивидуально, чем одни и те же привилегии для всех. PUBLIC не ограничен в его передаче только текущим пользователям. Любой новый пользователь добавляемый к вашей системе, автоматически получит все привилегии назначенные ранее всем, так что если вы за- хотите ограничить доступ к таблице всем, сейчас или в будущем, лучше всего предоставить привилегии иные чем SELECT для индивидуальных пользователей.

ПРЕДОСТАВЛЕНИЕ ПРИВИЛЕГИЙ С ПОМОЩЬЮ WITH GRANT OPTION

Иногда, создателю таблицы хочется чтобы другие пользователи могли получить привилегии в его таблице. Обычно это делается в системах, где один или более людей создают несколько (или все) базовые таблицы в ба- зе данных а затем передают ответственность за них тем кто будет фактически с ними работать. SQL позволяет делать это с помощью предложения WITH GRANT OPTION. Если Diane хотела бы чтобы Adrian имел право предоставлять привилегию SELECT в таблице Заказчиков другим пользователям, она дала бы ему привилегию SELECT с использованием предложения WITH GRANT OPTION:

GRANT SELECT ON Customers TO Adrian WITH GRANT OPTION; После того Adrian получил право передавать привилегию SELECT треть- им лицам; он может выдать команду GRANT SELECT ON Diane.Customers TO Stephen; или даже GRANT SELECT ON Diane.Customers TO Stephen WITH GRANT OPTION; Пользователь с помощью GRANT OPTION в особой привилегии для дан- ной таблицы, может, в свою очередь, предоставить эту привилегию к той же таблице, с или без GRANT OPTION, любому другому пользователю. Это не меняет принадлежности самой таблицы; как и прежде таблица принадлежат ее создателю. (поэтому пользователи получившие права, должны устанавливать префикс ID доступа владельца когда ссылаются к этим таблицам. Следующая глава покажет вам этот способ.) Пользователь же с помощью GRANT OPTION во всех привилегиях для данной таблицы будет иметь всю полноту власти в той таблице.

ОТМЕНА ПРИВИЛЕГИЙ

Также как ANSI предоставляет команду CREATE TABLE чтобы создать таблицу, а не DROP TABLE чтобы от нее избавиться, так и команда GRANT позволяет вам давать привилегии пользователям, не предоставляя способа чтобы отобрать их обратно. Потребность удалять привилегии сводится к команде REVOKE, фактически стандартному средству с достаточно понятной формой записи. Синтаксис команды REVOKE - похож на GRANT, но имеет обратный смысл. Чтобы удалить привилегию INSERT для Adrian в таблице Порядков, вы можете ввести

REVOKE INSERT ON Orders FROM Adrian;

Использование списков привилегий и пользователей здесь допустимы как и в случае с GRANT, так что вы можете ввести следующую команду:

REVOKE INSERT, DELETE ON Customers FROM Adrian, Stephen; Однако, здесь имеется некоторая неясность. Кто имеет право отменять при- вилегии? Когда пользователь с правом передавать привилегии другим, теряет это право? Пользователи которым он предоставил эти привилегии, также их потеряют? Так как это не стандартна особенность, нет никаких авторитетных ответов на эти вопросы, но наиболее общий подход - это такой: * Привилегии отменяются пользователем который их предоставил, и отмена будет каскадироваться, то есть она будет автоматически распространяться на всех пользователям получивших от него эту привилегию.

ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ ДЛЯ ФИЛЬТРАЦИИ ПРИВИЛЕГИЙ

Вы можете сделать действия привилегий более точными, используя представления. Всякий раз, когда вы передаете привилегию в базовой таблице пользователю, она автоматически распространяется на все строки, а при использовании возможных исключений UPDATE и REFERENCES, на все столбцы таблицы. Создавая представление которое ссылается на основную таблицу и затем переносит привилегию на представление, а не на таблицу, вы можете ограничивать эти привилегии любыми выражениями в запросе содержащимся в представлении. Это значительно улучшает базисные возможности команды GRANT.

КТО МОЖЕТ СОЗДАВАТЬ ПРЕДСТАВЛЕНИЯ?

Чтобы создавать представление, вы должны иметь привилегию SELECT во всех таблицах на которые вы ссылаетесь в представлении. Если представ- ление - модифицируемое, любая привилегия INSERT, UPDATE, и DELETE которые вы имеете в базовой таблице, будут автоматически передаваться представлению. Если вы испытываете недостаток в привилегиях на моди- фикацию в базовых таблицах, вы не сможете иметь их и в представления- х которые создали, даже если сами эти представления - модифицируе- мые. Так как внешние ключи не используются в представлениях, привилегия REFERENCES никогда не используется при создании представлений. Все эти ограничения - определяются ANSI. Нестандартные привилегии си- стемы (обсуждаемые позже в этой главе) также могут быть включены. В последующих разделах мы предположим, что создатели представлений которые мы обсуждаем, имеют частные или соответствующие привилегии во всех базовых таблицах.

ОГРАНИЧЕНИЕ ПРИВИЛЕГИИ SELECT ДЛЯ ОПРЕДЕЛЕННЫХ СТОЛБЦОВ

Предположим вы хотите дать пользователю Claire способность видеть только столбцы snum и sname таблицы Продавцов. Вы можете сделать это, поместив имена этих столбцов в представление

CREATE VIEW Clairesview AS SELECT snum, sname FROM Salespeople; и предоставить Claire привилегию SELECT в представлении, а не в самой таблице Продавцов: GRANT SELECT On Clairesview to Claire; Вы можете создать привилегии специально для столбцов наподобие использования других привилегий, но, для команды INSERT, это будет означать вставку значений по умолчанию, а для команды DELETE, ограничение столбца не будет иметь значения. Привилегии REFERENCES и UPDATE, конечно, могут сделать столбцы специфическими не прибегая к представлению.

ОГРАНИЧЕНИЕ ПРИВИЛЕГИЙ ДЛЯ ОПРЕДЕЛЕННЫХ СТРОК Обычно, более полезный способ чтобы фильтровать привилегии с представлениями - это использовать представление чтобы привилегия относилась только к определенным строкам. Вы делаете это, естественно, используя предикат в представлении который определит, какие строки являются включенными. Чтобы предоставить пользователю Adrian, привилегию UPDATE в таблице Заказчиков, для всех заказчиков размещенных в Лондоне, вы можете создать такое представление:

CREATE VIEW Londoncust AS SELECT * FROM Customers WHERE city = "London" WITH CHECK OPTION; Затем Вы должны передать привилегию UPDATE в этой таблице для Adrian: GRANT UPDATE ON Londoncust TO Adrian; В этом отличие привилегии для определенных строк от привилегии UPDATE для определенных столбцов, которая распространена на все столбцы таблицы Заказчиков, но не на строки, среди которых строки со значением пол city иным чем London не будут учитываться. Предложение WITH CHECK OPTION предохраняет Adrian от замены значения пол city на любое значение кроме London. ПРЕДОСТАВЛЕНИЕ ДОСТУПА ТОЛЬКО К ИЗВЛЕЧЕННЫМ ДАННЫМ Друга возможность состоит в том, чтобы предлагать пользователям доступ к уже извлеченным данным, а не к фактическим значением в таблице. Агрегатные функции, могут быть весьма удобными в применении такого способа. Вы можете создавать представление которое дает счет, среднее, и общее количество для порядков на каждый день порядка: CREATE VIEW Datetotals AS SELECT odate, COUNT (*), SUM (amt), AVG (amt) FROM Orders GROUP BY odate; Теперь вы передаете пользователю Diane - привилегию SELECT в представлении Datetotals: GRANT SELECT ON Datetotals TO Diane; ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ В КАЧЕСТВЕ АЛЬТЕРНАТИВЫ К ОГРАНИЧЕНИЯМ Одной из последних прикладных программ из серии, описанной в Главе 18 , является использование представлений с WITH CHECK OPTION как альтернативы к ограничениям. Предположим что вы хотели удостовериться, что все значения пол city в таблице Продавцов находятся в одном из городов где ваша компания в настоящее врем имеет ведомство. Вы можете установить ограничение CHECK непосредственно на столбец city, но позже может стать трудно его изменить, если ваша компания например откроет там другие ведомства. В качестве альтернативы, можно создать представление, которое исключает неправильные значения city: CREATE VIEW Curcities AS SELECT * FROM Salespeople WHERE city IN ("London", "Rome", "San Jose", "Berlin") WITH CHECK OPTION; Теперь, вместо того, чтобы предоставить пользователям привилегии модифицирования в таблице Продавцов, вы можете предоставить их в представлении Curcities. Преимущество такого подхода - в том, что если вам нужно сделать изменение, вы можете удалить это представление, создать новое, и предоставить в этом новом представлении привилегии пользователям, что проще чем изменять ограничения. Недостатком является то, что владелец таблицы Продавцов также должен использовать это представление если он не хочет чтобы его собственные команды бы- ли отклонены. С другой стороны, этот подход позволяет владельцу таблицы и любым другим получить привилегии модификации в самой таблице, а не в представлении, чтобы делать исключения для ограничений.

Это часто бывает желательно, но не выполнимо, если вы используете ограничения в базовой таблице. К сожалению, эти исключения нельзя будет увидеть в представлении. Если вы выберите этот подход, вам захочется создать второе представление, содержащее только исключения: CREATE VIEW Othercities AS SELECT * FROM Salespeople WHERE city NOT IN ("London", "Rome", "San Jose", "Berlin") WITH CHECK OPTION; Вы должны выбрать для передачи пользователям только привилегию SELECT в этом представлении, чтобы они могли видеть исключенные строки, но не могли помещать недопустимые значения city в базовую таблицу. Фактически, пользователи могли бы сделать запрос обоих представлений в объединении и увидеть все строки сразу.

ДРУГИЕ ТИПЫ ПРИВИЛЕГИЙ

Вы разумеется хотите знать, кто же имеет право первым создать таблицу. Эта область привилегии не относится к ANSI, но не может игнорировать- с. Все стандартные привилегии ANSI вытекают из этой привилегии; привилегии создателей таблиц которые могут передавать привилегии объекта. Если все ваши пользователи будут создавать в системе базовые таблицы с разными размерами это приведет к избыточности в них и к неэффективности системы. Притягивают к себе и другие вопросы:

Кто имеет право изменять, удалять, или ограничивать таблицы?

Должны ли права создания базовых таблиц отличаться от прав создания представлений?

Должен ли быть суперпользователь - пользователь который отвечает за поддержание базы данных и следовательно имеющий наибольшие, или все привилегии, которые не предоставляются индивидуально?

Пока ANSI не принимает в этом участие, а SQL используется в различных средах, мы не можем дать окончательный ответ на эти вопросы. Мы предлагаем рассмотреть здесь кусок наиболее общих выводов.

Привилегии которые не определяются в терминах специальных объектов данных называются - привилегиями системы, или правами базы данных. На базисном уровне, они будут вероятно включать в себя право создавать объекты данных, вероятно отличающиеся от базовых таблиц(обычно создаваемыми несколькими пользователями) и представления (обычно создаваемые большинством пользователей). Привилегии системы для создания представлений, должны дополнять, а не заменять привилегии объекта которые ANSI требует от создателей представлений (описанных ранее в этой главе). Кроме того, в системе любого размера всегда имеются некоторые типы суперпользователей - пользователей которые автоматически имеют большинство или все привилегии - и которые могут передать свой статус суперпользователя кому-нибудь с помощью привилегии или группы привилегий. Администратор Базы Данных, или DBA, является термином наиболее часто используемым для такого суперпользователя, и для привилегий которыми он обладает.

ТИПИЧНЫЕ ПРИВИЛЕГИИ СИСТЕМЫ

При общем подходе имеется три базовых привилегии системы: - CONNECT (Подключить), - RESOURCE (Ресурс), и - DBA (Администратор Базы Данных). Проще, можно сказать, что CONNECT состоит из права зарегистрироваться и права создавать представления и синонимы(см. Главу 23), если переданы привилегии объекта. RESOURCE состоит из права создавать базовые таблицы. DBA - это привилегия суперпользователя, дающая пользователю высокие полномочи в базе данных. Один или более пользователей с функциями администратора базы данных может иметь эту привилегию. Некоторые системы кроме того имеют специального пользователя, иногда называемого SYSADM или SYS (Системный Администратор Базы Данных), который имеет наивысшие полномочи; это - специальное им, а не просто пользователь со специальной DBA привилегией. Фактически только один человек имеет право зарегистрироваться с именем SYSADM, являющимся его идентификатором доступа. Различие весьма тонкое и функционирует по разному в различных системах. Для наших целей, мы будем ссылаться на высокопривилегированного пользователя, который разрабатывает и управляет базой данных имея полномочи DBA, понимая что фактически эти полномочи - та же сама привилегия. Команда GRANT, в измененной форме, является пригодной для использования с привилегиями объекта как и с системными привилегиями. Для начала передача прав может быть сделана с помощью DBA. Например, DBA может передать привилегию для создания таблицы пользователю Rodriguez следующим образом: GRANT RESOURCE TO Rodriguez;

СОЗДАНИЕ И УДАЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ

Естественно появляется вопрос, откуда возьмется пользователь с именем Rodriguez ? Как определить его ID допуска? В большинстве реализаций, DBA создает пользователя, автоматически предоставляя ему привилегию CONNECT. В этом случае, обычно добавляется предложение IDENTIFIED BY, указывающее пароль. (Если же нет, операционна система должна определить, можете ли вы зарегистрироваться в базе данных с данным ID доступа.) DBA может, например, ввести GRANT CONNECT TO Thelonius IDENTIFIED BY Redwagon; что приведет к созданию пользователя, с именем Thelonius, даст ему право регистрироваться, и назначит ему пароль Redwagon, и все это в одном предложении. Раз Thelonious - уже опознанный пользователь, он или DBA могут использовать эту же команду чтобы изменить пароль Redwagon. Хотя это и удобно, но все же имеются ограничения и в этом подходе. Это невозможность иметь пользователя который не мог бы зарегистрировать- с, хотя бы временно. Если вы хотите запретить пользователю регистрироваться, вы должны использовать для REVOKE привилегию CONNECT, ко- тора "удаляет" этого пользователя. Некоторые реализации позволяют вам создавать и удалять пользователей, независимо от их привилегий при регистрации. Когда вы предоставляете привилегию CONNECT пользователю, вы создаете этого пользователя. При этом чтобы сделать это Вы сами, должны иметь DBA привилегию. Если этот пользователь будет создавать базовые таблицы (а не только представления), ему нужно также предоставить привилегию RESOURCE. Но это сразу порождает другую проблему. Если вы сделаете попытку удалить привилегию CONNECT пользователя, который имеет им созданные таблицы, команда будет отклонена, потому что ее действие оставит таблицу без владельца, а это не позволяется. Вы должны сначала удалить все таблицы созданные этим пользователем, прежде чем удалить его привилегию CONNECT . Если эти таблицы не пустые, то вы вероятно захотите передать их данные в другие таблицы с по- мощью команды INSERT, которая использует запрос. Вам не нужно удалять отдельно привилегию RESOURSE; достаточно удалить CONNECT чтобы уда- лить пользователя. Хотя все выше сказанное - это вполне стандартный подход к привилегиям системы, он также имеет значительные ограничения. Появились альтернативные подходы, которые более конкретно определены и точнее управляют привилегиями системы.

Эти выводы несколько выводят нас за пределы стандарта SQL как это определено в настоящее врем, и, в некоторых реализациях, могут полностью выйти за пределы стандарта SQL. Эти вещи вероятно не будут слишком вас касаться, если вы не DBA или не пользователь высокого уровня. Обычные пользователи просто должны быть знакомыми с привилегиями системы в принципе, справляясь со своей документации только в случае специальных сообщений.

РЕЗЮМЕ

Привилегии дают вам возможность видеть SQL под новым углом зрения, когда SQL выполняет действия через специальных пользователей в специальной системе базы данных. Сама команда GRANT достаточно проста: с ее помощью, вы предоставляете те или иные привилегии объекта одному или более пользователям. Если вы предоставляете привилегию WITH GRANT OPTION пользователю, этот пользователь может в свою очередь предоставить эту привилегию другим. Теперь вы понимаете намеки на использование привилегий в представления- х - чтобы усовершенствовать привилегии в базовых таблицах, или как альтернативы к ограничениям - и на некоторые преимущества и недостатки та- кого подхода. Привилегии системы, которые необходимы, но не входят в область стандарта SQL, обсуждались в их наиболее общей форме и поэтому вы будете знакомиться с ними на практике. Глава 23 продолжит обсуждение о выводах в SQL, таких как сохранение или восстановление изменений, создание ваших собственных имен для таблиц принадлежащих другим людям, и понимание что происходит когда различные пользователи пытаются обращаться к одному и тому же объекту одновременно.

РАБОТА С SQL

1. Передайте Janet право на изменение оценки заказчика.

2. Передайте Stephan право передавать другим пользователям право делать запросы в таблице Порядков.

3. Отнимите привилегию INSERT(ВСТАВКА) в таблице Продавцов у Claire и у всех пользователей которым она была предоставлена.

4. Передайте Jerry право вставлять или модифицировать таблицу Заказчиков с сохранением его возможности оценивать значения в диапазоне от 100 до 500.

5. Разрешите Janet делать запросы в таблице Заказчиков, но запретите ему уменьшать оценки в той же таблице Заказчиков.