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 OUTFILEeLOAD DATA INFILE. | 
| INDEX | Permite o uso de CREATE INDEXeDROP
                INDEX | 
| INSERT | Permite o uso de INSERT | 
| LOCK TABLES | Permite o uso de LOCK TABLESem tabelas nas quais se
                tem o privilégioSELECT. | 
| 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 DATABASESexibe 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 LOGSeSET 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.

