Чтение онлайн

ЖАНРЫ

MySQL 5.0. Библиотека программиста

Гольцман Виктор

Шрифт:

Чтобы получить разрешение на выполнение операции с каким-либо объектом базы данных, пользователю достаточно иметь привилегию соответствующего типа для какой-либо области действия, содержащей этот объект. Например, пользователь сможет выполнить запрос данных из столбца description (наименование) таблицы Products (Товары) базы данных SalesDept (Отдел продаж), если у него есть хотя бы одна из следующих привилегий:

• глобальная привилегия SELECT;

• привилегия SELECT для базы данных SalesDept;

• привилегия SELECT для таблицы Products;

• привилегия SELECT для столбца description.

Для выполнения некоторых операций может потребоваться несколько типов привилегий. Например, команда

UPDATE SalesDept.Products SET price=\'548.00\' WHERE id=5;

доступна пользователю, если у него одновременно есть привилегия SELECT для таблицы Products (или для базы данных SalesDept, или глобальная) и привилегия UPDATE для столбца price (или для таблицы Products, или для базы данных SalesDept, или глобальная).

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

Предоставление привилегий

Для предоставления привилегий пользователям используется команда

GRANT <Тип привилегии>

[(<Список

столбцов>)] ON <Область действия>

TO <Идентификатор пользователя>

[WITH GRANT OPTION];

В качестве области действия вы можете указать одно из следующих значений:

• *.* – привилегия будет действовать глобально;

• <Имя базы данных>.* – привилегия будет действовать для указанной базы данных;

• * – привилегия будет действовать для базы данных, которая в момент выполнения команды GRANT являлась текущей;

• <Имя базы данных>.<Имя таблицы> или <Имя таблицы> – привилегия будет действовать для указанной таблицы (если имя базы данных не указано, подразумевается текущая база данных). Если требуется создать привилегию не для всей таблицы, а только для отдельных столбцов, необходимо перечислить эти столбцы в скобках перед ключевым словом ON.

Рассмотрим несколько примеров.

• GRANT CREATE ON *.* TO \'anna\'@\'localhost\

Команда предоставляет пользователю anna\'@\'localhost привилегию на создание баз данных и таблиц в любой базе данных.

• GRANT DROP ON SalesDept.* TO \'anna\'@\'localhost\

Команда предоставляет пользователю anna\'@\'localhost привилегию на удаление таблиц в базе данных SalesDept (Отдел продаж), а также на удаление самой базы данных SalesDept.

• GRANT SELECT ON SalesDept.Products TO \'anna\'@\'localhost\ Команда предоставляет пользователю anna\'@\'localhost привилегию на получение данных из таблицы Products (Товары) базы данных SalesDept (Отдел продаж).

• GRANT UPDATE (price) ON SalesDept.Products TO \'anna\'@\'localhost\ Команда предоставляет пользователю anna\'@\'localhost привилегию на изменение данных в столбце price (цена) таблицы Products (Товары).

При назначении привилегий необходимо иметь в виду следующие особенности.

• Если учетная запись с указанным идентификатором не существует, команда GRANT может создать такую запись. Отключить автоматическое создание учетной записи позволяет ключевое слово NO_AUTO_CREATE_USER в значении переменной sql_mode (напомню, что настройку режима взаимодействия с сервером MySQL мы обсуждали в подразделе «Вставка отдельных строк» главы 2).

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

• Если при создании привилегии вы указываете параметр WITH GRANT OPTION, то пользователь получает возможность «делиться» не только созданной привилегией, но и другими своими привилегиями в рамках данной области действия. Например, после выполнения команд

GRANT SELECT ON *.* TO \'marina\

GRANT INSERT ON SalesDept.* TO \'marina\' WITH GRANT OPTION;

GRANT DELETE ON SalesDept.Customers TO \'marina\

пользователь marina может предоставлять другим пользователям следующие привилегии:

– привилегии SELECT, INSERT и GRANT OPTION на уровне базы данных SalesDept (Отдел продаж). Хотя сам пользователь marina имеет глобальную привилегию SELECT, его возможности делегирования привилегий ограничены базой данных SalesDept;

– привилегию DELETE на уровне таблицы Customers (Клиенты) базы данных SalesDept, так как область действия этой привилегии входит в область действия привилегии GRANT OPTION.

• Если вы предоставляете привилегию GRANT OPTION нескольким пользователям, эти пользователи могут «обменяться» привилегиями, то есть объединить свои наборы привилегий.

• Привилегии, областью действия которых является таблица или столбец, вступают в силу немедленно – пользователь может сразу же начать выполнять SQL-команды, разрешенные ему новой привилегией. Привилегии, относящиеся к базе данных, начинают действовать после выполнения команды USE <имя базы данных>, то есть после выбора какой-либо базы данных в качестве текущей. Глобальные привилегии начинают применяться при следующем подключении пользователя к серверу MySQL.

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

Отмена привилегий

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

REVOKE <Тип привилегии>

[(<Список столбцов>)] ON <Область действия>

FROM <Идентификатор пользователя>;

Например,:

• REVOKE CREATE ON *.* FROM \'anna\'@\'localhost\

Команда отменяет глобальную привилегию пользователя \'anna\'@\'localhost\', разрешавшую создание баз данных и таблиц.

• REVOKE DROP ON SalesDept.* FROM \'anna\'@\'localhost\ Команда отменяет привилегию пользователя \'anna\'@\'localhost\' на удаление базы данных SalesDept (Отдел продаж) и таблиц в этой базе данных.

• REVOKE SELECT ON SalesDept.Products

FROM \'anna\'@\'localhost\

Команда отменяет привилегию пользователя \'anna\'@\'localhost\' на получение данных из таблицы Products (Товары) базы данных SalesDept.

• REVOKE UPDATE (price) ON SalesDept.Products

FROM \'anna\'@\'localhost\

Команда отменяет привилегию пользователя \'anna\'@\'localhost\' на изменение данных в столбце price (цена) таблицы Products (Товары).

Параметры команды REVOKE имеют тот же смысл, что и параметры команды GRANT. Аналогичны и правила вступления изменений в силу.

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

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

Просмотр привилегий

Сведения о привилегиях доступа содержатся в следующих таблицах системной базы данных mysql.

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

• Привилегии, областью действия которых является отдельная база данных, хранятся в таблице db (база данных). Первичный ключ в этой таблице образуют столбцы Host (хост), Db (база данных) и User (пользователь). Таким образом, каждая строка таблицы определяет привилегии одного пользователя по отношению к одной базе данных. Как и в таблице user, каждой привилегии соответствует отдельный столбец, возможными значениями которого являются \'Y\'
и \'N\'.

...

Примечание

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

• Привилегии, относящиеся к отдельным таблицам, хранятся в таблице tables_ priv. Первичным ключом в этой таблице служат столбцы Host (Хост), Db (База данных), User (Пользователь) и Table_name (Имя таблицы). Таким образом, каждая строка таблицы tables_priv определяет привилегии доступа конкретного пользователя к конкретной таблице. Типы привилегий, которыми обладает пользователь, перечислены в столбце Table_priv (Привилегии доступа к таблице), имеющем тип данных SET. Кроме того, в таблице tables_priv имеется столбец Column_priv (Привилегии доступа к столбцу) с типом данных SET, значение которого указывает, что у пользователя имеются привилегии доступа к отдельным столбцам таблицы.

• Привилегии для отдельных столбцов хранятся в таблице columns_priv. Первичный ключ этой таблицы состоит из столбцов, идентифицирующих пользователя (Host и User), и столбцов, идентифицирующих столбец (Db, Table_name и Column_name). Типы привилегий, которыми обладает пользователь по отношению к столбцу, перечислены в столбце Column_priv (Привилегии доступа к столбцу) с типом данных SET.

Таблицы user, db, tables_priv и columns_priv вы можете использовать для получения информации о пользователях, обладающих привилегиями доступа к интересующему вас объекту базы данных. Если же требуется, наоборот, узнать, к каким объектам имеет доступ конкретный пользователь, выполните команду

SHOW GRANTS [FOR Идентификатор пользователя>];

Команда SHOW GRANTS выводит сведения о привилегиях пользователя в виде набора команд GRANT, с помощью которых можно сформировать текущий набор привилегий пользователя. Если идентификатор пользователя не задан, вы увидите свои привилегии.

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

Управление привилегиями в MySQL Administrator

В подразделе «Управление учетными записями в MySQL Administrator» вы узнали, каким образом в утилите MySQL Administrator представлена информация о зарегистрированных пользователях. По умолчанию для каждого пользователя отображается вкладка Schema Privileges (Привилегии доступа к базам данных), содержащая сведения о привилегиях, областью действия которых являются отдельные базы данных (рис. 5.4).

Рис. 5.4. Вкладка Schema Privileges

Чтобы увидеть остальные привилегии, выполните следующую настройку.

1. В главном окне MySQL Administrator откройте меню Tools (Сервис) и выберите пункт Options (Параметры).

2. В появившемся окне Options (Параметры) в левой области щелкните на пункте Administrator (Администратор).

3. В правой области в группе полей User Administration (Управление пользователями) установите флажок Show Global Privileges (Отображать глобальные привилегии) и флажок Show Schema Object Privileges (Отображать привилегии для объектов базы данных).

4. Нажмите кнопку Apply (Сохранить), а затем кнопку Close (Закрыть).

После этого в главном окне MySQL Administrator появятся вкладка Global Privileges (рис. 5.5) с информацией о глобальных привилегиях пользователя и вкладка Schema Object Privileges (рис. 5.6) с информацией о привилегиях доступа к отдельным таблицам и столбцам.

Рис. 5.5. Вкладка Global Privileges

Рис. 5.6. Вкладка Schema Object Privileges

Для управления глобальными привилегиями пользователя откройте вкладку Global Privileges. Имеющиеся у пользователя привилегии перечислены в колонке Assigned Privileges (Назначенные привилегии). Отсутствующие у пользователя привилегии перечислены в колонке Available Privileges (Доступные привилегии). Для присвоения и отмены привилегий предназначены кнопки

и

После того как набор привилегий сформирован, нажмите кнопку Apply Changes (Сохранить изменения).

Аналогичным образом выполняется настройка привилегий доступа к отдельным базам данных на вкладке Schema Privileges. Чтобы просмотреть и отредактировать список привилегий пользователя для какой-либо базы данных, щелкните на названии этой базы в колонке Schemata (Базы данных).

Вкладка Schema Object Privileges отличается от вкладки Schema Privileges только тем, что колонка Schemata содержит иерархическое дерево объектов базы данных. Значок

слева от названия объекта позволяет увидеть список подчиненных объектов, то есть таблиц базы данных или столбцов таблицы. Чтобы просмотреть и отредактировать список привилегий пользователя для какого-либо объекта, найдите этот объект в дереве и щелкните на его названии.

В предыдущем подразделе говорилось, что столбец Column_priv (Привилегии доступа к столбцу) имеется как в таблице columns_priv, так и в таблице tables_priv системной базы данных mysql. В MySQL Administrator привилегии доступа к столбцам (названия таких привилегий начинаются со слова COLUMN) также присутствуют в списках доступных привилегий и для самого столбца, и для содержащей его таблицы. Чтобы присвоить пользователю привилегию доступа к столбцу, ее нужно добавить в список назначенных привилегий дважды: на уровне столбца и на уровне таблицы.

Пусть, например, необходимо предоставить пользователю привилегию на изменение данных в столбце price (цена) в таблице Products (Товары) (аналогично команде GRANT UPDATE (price) ON SalesDept.Products TO \'anna\'@\'localhost\). Для этого щелкните на названии таблицы Products и с помощью кнопки

переместите привилегию COLUMN UPDATE в колонку Assigned Privileges (Назначенные привилегии) (рис. 5.7).

Рис. 5.7. Предоставление привилегии доступа к столбцу. Шаг 1

Поделиться с друзьями: