Назначение и удаление прав. Задание прав. команда grant Использование представлений для фильтрации привилегий

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

В этой главе, вы обучитесь работе с привилегиями. Как сказано в Главе 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 делать запросы в таблице Заказчиков, но запретите ему уменьшать оценки в той же таблице Заказчиков.

Платформа SQL Server использует инструкцию REVOKE в качестве способа отмены настроек прав доступа, назначенных данному пользователю. Этот момент важен, поскольку SQL Server поддерживает дополнительную инструкцию DENY, которая явно запрещает пользователю доступ к указанному ресурсу. В SQL Server инструкцию REVOKE можно использовать для отмены привилегий, назначенных пользователю при помощи инструкции GRANT. Если вы хотите явным образом лишить пользователя определенной привилегии, вам следует использовать инструкцию DENY.

Платформа SQL Server не поддерживает предложения HIERARCHY OPTION и ADMIN OPTION стандарта ANSI. Хотя предложение ADMIN OPTION и не поддерживается, в версии команды REVOKE SQL Server есть две административные привилегии (CREATE и BACKUP). Синтаксис инструкции следующий.

REVOKE {[объектная_привилегия] [, …] | [системная_привилегия]} [(столбец [, …])]]| {ТО | FROM} {имя_получателя [, …] | роль [, …] | PUBLIC | GUEST} ]

GRANT OPTION FOR

Пользователь лишается права назначать конкретные привилегии другим пользователям.

объектная привилегия

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

ALL

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

(SELECT | INSERT DELETE UPDATE}

Указанный пользователь лишается указанной привилегии доступа к указанному объекту (например, к таблице или представлению). Для отмены привилегий уровня столбца используйте список столбцов, заключенный в скобки.

REFERENCES

Отменяется право создавать и удалять ограничения типа «внешний ключ», ссылающиеся на объект базы данных как на родительский объект.

Отменяется право пользователя создавать или удалять правило в таблице или представлении.

Отменяется право выполнять хранимую процедуру, пользовательскую функцию или расширенную хранимую процедуру.

системная привилегия

Отменяется право выполнения следующих инструкций: CREATE DATABASE, CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TABLE, CREATE VIEW, BACKUP DATABASE и BACKUP LOG.

ON [объект] [(столбец [, …])]

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

[ТО | FROM] имя получателя | роль | PUBLIC | GUEST

Указываются пользователи или роли, теряющие указанную привилегию. Для отмены привилегий, назначенных роли PUBLIC (которая подразумевает всех пользователей), можно использовать ключевое слово PUBLIC. Можно перечислить несколько получателей, разделяя их имена запятыми. В SQL Server также поддерживается учетная запись GUEST, которую используют все пользователи, которые не имеют своей записи в базе данных.

Удаляются привилегии пользователей, которые получили свои права через предложение WITH GRANT OPTION. Это предложение является необходимым при использовании предложения GRANT OPTION FOR.

AS (имя_группы имя _роли}

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

Две формы инструкции REVOKE - REVOKE объектная привилегия и REVOKE системная_привилегия являются взаимоисключающими. Не пытайтесь выполнить обе операции в одной инструкции. Ключевое синтаксическое отличие между ними состоит в том, что не следует использовать предложение ON при удалении системных привилегий. Например, чтобы удалить системную привилегию, можно использовать следующую команду.

REVOKE CREATE DATABASE, BACKUP DATABASE FROM dylan, katie

Если привилегии были присвоены пользователю с применением предложения WITH GRANT OPTION, то отменять эти привилегии следует с одновременным использованием двух предложений - WITH GRANT OPTION и CASCADE. Например:

REVOKE GRANT OPTION FOR SELECT, INSERT, UPDATE, DELETE ON titles TO editors CASCADE GO

Команду REVOKE можно использовать только в текущей базе данных. Соответственно всегда неявно предполагаются опции стандарта ANSI CURRENTJJSER и CURRENTROLE. Инструкция REVOKE также используется для отмены всех параметров DENY.

Платформа SQL Server также поддерживает дополнительную инструкцию DENY. Синтаксис инструкции DENY идентичен синтаксису инструкции REVOKE. Однако, по сути, они отличаются тем, что REVOKE нейтрализует привилегии пользователя, a DENY их явно запрещает. Используйте инструкцию DENY, чтобы запретить пользователю или роли доступ к привилегии, даже если привилегия предоставляется явно или через назначение роли.

Инструкция REVOKE должна использоваться для удаления ранее предоставленных или запрещенных (DENY) привилегий. Например, пользователь kelly ушла в продолжительный отпуск по уходу за ребенком. На это время ее доступ к таблице employee был запрещен. Она вернулась, и мы вновь разрешили привилегии.

DENY ALL ON employee TO Kelly GO

REVOKE ALL ON employee TO Kelly GO

В этом примере команда REVOKE не удаляет ее привилегии, она нейтрализует действие команды DENY.

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

Права доступа предоставляются командой 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;

 Top