GRANT priv_type [(column_list)] [, tipo_priv [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY [PASSWORD] 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]
O comando GRANT
é implementado no MySQL
versão 3.22.11 ou posterior. Para versões anteriores do MySQL,
a instrução GRANT
não faz nada.
Os comandos GRANT
e REVOKE
permitem aos administradores do sistema criar usuários e
conceder e revogar direitos aos usuários do MySQL em quatro
níveis de privilégios:
Nível Global
Privilégios globais aplicam para todos os bancos de dados
em um determinado servidor. Estes privilégios são
armazenados na tabela mysql.user
.
GRANT ALL ON *.*
e REVOKE ALL ON
*.*
concederão e revogarão apenas privilégios
globais.
Nível dos bancos de dados
Privilégios de bancos de dados aplicam-se a todas as
tabelas em um determinado banco de dados. Estes privilégios
são armazenados nas tabelas mysql.db
e
mysql.host
. GRANT ALL ON
db.*
e REVOKE ALL ON db.*
concederão e revogarão apenas privilégios de banco de
dados.
Nível das tabelas
Privilégios de tabelas aplicam-se a todas as colunas em uma
determinada tabela. Estes privilégios são armazenados na
tabela mysql.tables_priv
. GRANT
ALL ON db.table
e REVOKE ALL ON
db.table
concederão e revogarão apenas
privilégios de tabelas.
Nível das colunas
Privilégios de colunas aplicam-se a uma única coluna em
uma determinada tabela. Estes privilégios são armazenados
na tabela mysql.columns_priv
.
Para as instruções GRANT
e
REVOKE
, tipo_priv
pode ser
especificado como um dos seguintes:
ALL [PRIVILEGES] |
Configura todos os privilégios simples exceto WITH GRANT
OPTION
|
ALTER |
Permite o uso de ALTER TABLE
|
CREATE |
Permite o uso de CREATE TABLE
|
CREATE TEMPORARY TABLES |
Permite o uso de CREATE TEMPORARY TABLE
|
DELETE |
Permite o uso de DELETE
|
DROP |
Permite o uso de DROP TABLE . |
EXECUTE |
Permite que o usuário execute stored procedures (MySQL 5.0) |
FILE |
Permite o uso de SELECT ... INTO OUTFILE e
LOAD DATA INFILE . |
INDEX |
Permite o uso de CREATE INDEX e DROP
INDEX
|
INSERT |
Permite o uso de INSERT
|
LOCK TABLES |
Permite o uso de LOCK TABLES em tabelas nas quais se
tem o privilégio SELECT . |
PROCESS |
Permite o uso de SHOW FULL PROCESSLIST
|
REFERENCES |
Para o futuro |
RELOAD |
Permite o uso de FLUSH
|
REPLICATION CLIENT |
Da o direto ao usuário de perguntar onde o slave/master está. |
REPLICATION SLAVE |
Necessário para a replicação dos slaves (para ler logs binário do master). |
SELECT |
Permite o uso de SELECT
|
SHOW DATABASES |
SHOW DATABASES exibe todos os banco de dados. |
SHUTDOWN |
Permite o uso de mysqladmin shutdown
|
SUPER |
Permite a conexão (uma vez) mesmo se max_connections tiverem sido
alcançados e executa o comando CHANGE
MASTER , KILL thread ,
mysqladmin debug , PURGE
MASTER LOGS e SET GLOBAL
|
UPDATE |
Permite o uso de UPDATE
|
USAGE |
Sinônimo para ``sem privilégios.'' |
GRANT OPTION |
Sinônimo para WITH GRANT OPTION
|
USAGE
pode ser usado quando você quer criar
um usuário sem privilégios.
Os privilégios CREATE TEMPORARY TABLES
,
EXECUTE
, LOCK TABLES
,
REPLICATION ...
, SHOW
DATABASES
e SUPER
são novos na
versão 4.0.2. Para usar estes novos privilégios após
atualizar para 4.0.2, você tem que executar o script
mysql_fix_privilege_tables
. See
Secção 2.5.6, “Atualizando a Tabela de Permissões”.
Em versões anteriores do MySQL, o privilégio
PROCESS
dá o mesmo direitos que o novo
privilégio SUPER
.
Para anular o privilégio grant
de um usuário, utilize o valor tipo_priv
de
GRANT OPTION
:
mysql> REVOKE GRANT OPTION ON ... FROM ...;
Os únicos valores de tipo_priv
que você
pode especificar para uma tabela são SELECT
,
INSERT
, UPDATE
,
DELETE
, CREATE
,
DROP
, GRANT
,
INDEX
e ALTER
.
Os únicos valores de tipo_priv
que você
pode especificar para uma coluna (isto é, quando você usar uma
cláusula column_list
) são
SELECT
, INSERT
e
UPDATE
.
O MySQL permite que você crie privilégios a nível de banco de dados mesmo se o banco de dados não existir para tornar fácil de se preparar para o uso do banco de dados. Atualmente, no entanto, o MySQL não permite criar permissões de a nível de tabela se a tabela não existir. O MySQL não revogará automaticamente qualquer privilégio, mesmo se você apagar uma tabela ou banco de dados.
Você pode configurar privilégios globais utilizando a sintaxe
ON *.*
. Você pode configurar privilégios de
bancos de dados utilizando a sintaxe ON
nome_bd.*
. Se você especificar ON
*
e estiver com algum banco de dados aberto, será
configurado os privilégios somente para este banco de dados.
(AVISO: Se você especificar
ON *
e você não tem
possui um banco de dados aberto, irá afetar os privilégios
globais!).
Note por favor Os
metacaracteres ‘_
’ e
‘%
’ são permitidos na
especificação dos nomes de bancos de dados em comandos
GRANT
. Isto significa que se você deseja
usar um caracater ‘_
’ como parte
de um nome de banco de dados, você deve especificá-lo como
'\_
' no comando GRANT
,
para prevenir o usuário de poder acessar bancos de dados
adicionais que correspondam ao padrão do metacaracter, ex.,
GRANT ... ON `foo\_bar`.* TO ...
.
Para acomodar concessões de direitos para usuários de
máquinas arbitrárias, o MySQL suporta a especificação do
valor user_name
no formato
usuário@máquina
. Se você desejar especificar uma
string user
contendo caracteres especiais
(como o ‘-
’), ou uma string
contendo caracteres especiais ou meta caracteres (como o
‘%
’), você pode colocar o
usuário ou o nome de máquina entre aspas (por exemplo,
'usuário-teste'@'máquina-teste'
).
Você pode especificar meta caracteres no nome da máquina. Por
exemplo, user@"%.loc.gov"
se aplica a
user
para qualquer máquina no domínio
loc.gov
, e
user@"144.155.166.%"
se aplica a
user
em qualquer máquina na subrede de
classe C 144.155.166
.
O formato simples user
é sinônimo de
user@"%"
.
O MySQL não suporta metacaracteres em nomes de usuários.
Usuários anônimos são definidos inserindo entradas com
User=''
na tabela
mysql.user
ou criando um usuário com um nome
vazio com o comando GRANT
.
Nota: Se você permite o acesso
de usuários anônimos ao seu servidor MySQL, você deve também
concecder privilégios a todos os usuários locais como
user@localhost
porque, de outra forma, a
entrada de usuário anônimo para a máquina local na tabela
mysql.user
será usada quando o usuário
tentar a conexão ao servidor MySQL da máquina local!
Você pode verificar se isto se aplica a você executando a seguinte instrução:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
No momento, GRANT
suporta somente nomes de
máquinas, tabelas bancos de dados e colunas até 60 caracteres.
Um nome de usuário pode ter até 16 caracteres.
Os privilégios para uma tabela ou coluna são formados através
do OU lógico dos privilégios em cada um dos quatro níveis de
privilégios. Por exemplo, se a tabela
mysql.user
especifica que um usuário tem um
privilégio global select, isto
não pode ser negado por uma entrada no nível de banco de
dados, tabela ou coluna.
Os privilégios para uma coluna podem ser calculados da seguinte forma:
privilégios globais OR (privilégios de banco de dados AND privilégios de máquina) OR privilégios de tabela OR privilégios de coluna
Na maioria dos casos, os direitos a um usuário são atribuídos em apenas um dos níveis de privilégios, portanto a vida normalmente não é tão complicada como mostrado acima. Os detalhes do procedimento de verificação dos privilégios são apresentados em Secção 4.3, “Detalhes Gerais de Segurança e o Sistema de Privilégio de Acesso do MySQL”.
Se você concede privilégios para uma combinação de usuário
e máquina que não existem na tabela
mysql.user
, um registro é adicionado e
permanece lá até ser removido com um comando
DELETE
. Em outras palavras,
GRANT
pode criar registros na tabela
user
, mas REVOKE
não as
removerá; para removê-las você deve usar a instrução
explícita DELETE
.
Na Versão 3.22.12 ou posterior do MySQL, se um novo usuário é
criado ou se você possui privilégios de concessão globais, a
senha do usuário será especificada utilizando a cláusula
IDENTIFIED BY
, se uma for dada. Se o usuário
já possui uma senha, ela é trocada pela nova.
Se você não quiser enviar a senha em texto puro você pode
usar a opção PASSWORD
seguido de uma senha
embaralhada da função SQL PASSWORD()
ou da
função da API C make_scrambled_password(char *to,
const char *password)
.
CUIDADO: Se você criar um novo
usuário mas não especificar uma cláusula IDENTIFIED
BY
, o usuário não possuirá uma senha. Isto não é
seguro.
Senhas podem também ser configuradas com o comando SET
PASSWORD
. See Secção 5.5.6, “Sintaxe de SET
”.
Se você conceder privilégios para um banco de dados, uma
entrada na tabela mysql.db
é criada se
necessário. Quando todos os privilégios para o banco de dados
forem removidos com REVOKE
, este registro é
removido.
Se um usuário não tem privilégios em uma tabela, a tabela
não é mostrada quando o usuário solicita uma lista de tabelas
(com a instrução SHOW TABLES
por exemplo).
O mesmo é verdade para SHOW DATABASES
A cláusula WITH GRANT OPTION
dá ao usuário
habilidade de fornecer à outros usuários quaisquer
privilégios que ele tenha em um nível específico de
privilégio. Você deve ter cuidado ao fornecer o privilégio
grant, pois dois usuários
podem se unir para unir privilégios!
MAX_QUERIES_PER_HOUR #
,
MAX_UPDATES_PER_HOUR #
e
MAX_CONNECTIONS_PER_HOUR #
sãp novos no
MySQL versão 4.0.2. Estas opções limitam o número de
consultas/atualizações e logins que o usuários pode fazer
durente uma hora. Se #
é 0 (padrão), então
isto significa que não há limites para aquele usuário. See
Secção 4.4.7, “Limitando os Recursos dos Usuários”. Nota: para especificar
qualquer destas opções para um usuário existente sem
adicionar outros privilégios adicionais, use GRANT
USAGE ON *.* ... WITH MAX_...
.
Você não pode conceder a outro usuário um privilégio que não possua; o privilégio GRANT possibilita fornecer somente os privilégios que possuir.
Esteja ciente que quando conceder a um usuário o privilégio
GRANT em um nível particular
de privilégios, qualquer privilégio que o usuário já possua
(ou seja fornecido no futuro!) nesse nível também pode ser
concedido por este usuário. Suponha que você conceda a um
usuário o privilégio INSERT
em um banco de dados. Se você conceder o privilégio
SELECT no banco de dados e
especificar WITH GRANT OPTION
, o usuário
além de poder repassar o privilégio
SELECT poderá também repassar
o insert. Se você concede o
privilégio UPDATE para o
usuário no banco de dados, o usuário poderá conceder os
privilégios INSERT,
SELECT e
UPDATE.
Você não deve conceder privilégios ALTER a um usuário comum. Se você fizer isto, o usuário pode tentar enganar o sistema de privilégios renomeando tabelas!
Perceba que se você estiver utilizando privilégios de tabelas ou colunas, mesmo que para apenas um usuário, o servidor examina os privilégios de tabelas e colunas para todos os usuários e isto irá deixar o MySQL um pouco mais lento.
Quando o mysqld
inicia, todos os privilégios
são lidos na memória. Privilégios de bancos de dados, tabelas
e colunas são iniciados um vez, e privilégios ao nível de
usuário fazem efeito na próxima vez que o usuário conectar.
Modificações nas tabelas de permissões que você realiza
utilizando GRANT
ou REVOKE
são percebidas pelo servidor imediatamente. Se você modificar
as tabelas de permissões manualmente (utilizando
INSERT
, UPDATE
, etc),
você deve executar uma instrução FLUSH
PRIVILEGES
ou executar mysqladmin
flush-privileges
para dizer ao servidor para
recarregar as tabelas de permissões. See
Secção 4.4.3, “Quando as Alterações nos Privilégios tem Efeito”.
As maiores diferenças entre o padrão SQL e versões MySQL de
GRANT
são:
No MySQL privilégios são fornecidos para uma combinação de usuário e máquina e não somente para um usuário.
O SQL-99 não possui privilégios no nível global ou de
bancos de dados, e não suporta todos os tipos de
privilégios que o MySQL suporta. O MySQL não suporta os
privilégios TRIGGER
,
EXECUTE
ou UNDER
do
SQL-99.
Os privilégios do SQL-99 são estruturadados em uma maneira hierárquica. Se você remover um usuário, todos os privilégios do usuário são removidos. No MySQL os privilégios concedidos não são removidos automaticamente, mas você deve removê-los se necessário.
Se no MySQL você possuir o privilégio
INSERT
em somente parte das colunas em
uma tabela, você pode executar instruções
INSERT
na tabela; As colunas em que você
não tem o privilégio INSERT
irão
receber seus valores padrões. O SQL-99 necessita que você
tenha o privilégio INSERT
em todas as
colunas.
Quando você remove uma tabela no SQL-99, todos os
privilégios para a tabela são removidos. Se você remover
um privilégio no SQL-99, todos os privilégios que foram
concedidos baseado neste privilégio são também removidos.
No MySQL, privilégios só podem ser removidos com comandos
REVOKE
explícitos ou manipulando as
tabelas de permissões do MySQL.
Para uma descrição do uso de REQUIRE
, veja
Secção 4.4.10, “Usando Conexões Seguras”.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.