Outorgando privilégios para objetos em SQL (versão Interbase)

Célio G.  -  MC527 -  Set 2001

Privilégios são outorgados através do comando SQL  grant.

Há dois tipos de privilégios:
(i) privilégios de acesso (a tabelas,visões, etc) e que são: select, insert, delete, update [col,col..] e references;
( all significa todos os 5 privilégios acima); o privilégio para atualizar uma tabela (update) pode, opcionalmente, ser restringido para uma ou mais colunas da tabela (ver um exemplo mais adiante);
references é o privilégio que permite definir numa outra tabela, digamos  Dependentes, uma chave estrangeira para a Chave Primária da tabela em questão, digamos, Funcionarios) e,
(ii) privilégio para execução de stored procedures e triggers: execute

Notação:
Uma palavra com a letra final  s entre parênteses significa uma ou mais entidades daquele tipo.
Por exemplo: user(s): uma lista de um ou mais usuarios do SGBD (separados por virgula);
public significa: todos os usuários do sistema (SGBD e Unix)
privilégio(s): uma lista de um ou mais  privilégios de acesso,
tabela(s): uma lista de um ou mais nomes de tabelas ou visões (onde aparece nome de tabela estenda para nome de visão)
Uma palavra reservada entre colchetes significa que seu uso é opcional. Por exemplo:  [table]
Possíveis alternativas para uma parte de um comando serão separadas pela barra vertical: |
Palavras reservadas serão escritas simultaneamente  em bold e itálico. Nomes de objetos criados por usuários serão escritos com o font normal. Usaremos indistintamente minusculas (preferivel) ou maiusculas para palavras reservadas.
Por exemplo:  GRANT  ou  grant.

Outorgando privilégios sobre objetos a usuários:

    grant privilegio(s) on [table]  tablename(s) to user(s)
    Exemplos:
           grant all on mytable to public
            grant update salario on funcionarios to bigboss
                                (o usuário bigboss pode atualizar a coluna salario da tabela funcionarios)
           grant references on funcionarios to bob
                    (bob pode definir  Chave Estrangeira em sua(s) tabelas(s)  referenciando  a Chave Primária
                    de Funcionarios)
Role

É um bilhete contendo um conjunto de privilégio(s) para uma ou mais tabelas ou visões. Pode ser concedido (via grant) a um ou mais usuários.
Passos para criar/usar um role:

  1. Create role rolename
  2. Grant privilegio(s) on tabela(s) to rolename
  3. Grant rolename(s) to user(s)
  4. Usuário ao se conectar a uma base de dados pode especificar o rolename desejado:

  5. Connect databasename user username password userpassword role rolename
Passagem de privilégios de um usuário para outro

Inicialmente o criador de um objeto (tabela, view, stored procedure, trigger, etc) possui todos os privilégios sobre o objeto e ninguém mais.
O criador pode então conceder  privilégios (discriminadamente) a outros usuários com um dos comandos vistos anteriormente.
O direito de passar privilégios adiante pode ser concedido caso o criador inclua a opção with grant option no final do comando grant.
Exemplo:
        grant all on mytable to martina with grant option
 (a usuária martina adquire o direito de passar a qualquer usuário os privilégios de acesso que tenha (no caso todos) sobre a tabela mytable)

De forma semelhante, um role pode ser passado adiante se foi concedido pelo seu criador com a opção with admin option:
    Grant rolename(s) to user(s) with admin option

Privilégios relacionados com stored procedures e triggers

  1. Para que usuários possam executar uma stored procedure o seu criador deve conceder o privilégio de execução (execute) dessa stored procedure a esses usuarios via comando:

  2. grant execute on procedure procedurename(s) to user(s)
     
  3. Para que outras stored procedures ou triggers possam chamar a stored procedure procname o criador de procname deve emitir o comando:

  4. grant execute on procedure procname to otherprocname(s) | triggername(s)
     
  5. Para permitir que uma stored procedure ou trigger possa executar operações de acesso/atualização sobre

  6. uma tabela o criador da  tabela (ou o criador da stored procedure, caso tenha  o(s)  privilégio(s) apropriados
    sobre a tabela) deve executar o comando:
    grant privilegio(s) on [table] tablename to procedure procname
Revogação de privilégios

Através do comando SQL  revoke.

Restrições gerais sobre revogação de privilégios:

  1. Apenas o usuário que outorgou privilégio(s) (via grant ) pode revogá-lo(s) de um ou mais usuários.
  2. Privilégio(s)  outorgados por outros usuários (mesmo que idênticos) não são afetados, ou seja, privilégios são cumulativos. Por exemplo: se ambas, Ana e Beatriz, outorgaram um priviégio a Clara  através do comando:

  3. grant insert on departments to Clara,
    e posteriormente Ana revoga o privilégio de Clara via comando:
    revoke insert on departments from Clara,
    Clara continua podendo inserir linhas em departments pois ainda retém o privilégio concedido por Beatriz
  4. Ao revogar de um usuário U  privilégio(s) concedido(s) com grant option,  o(s) privilégio(s) é(são) automaticamente removido(s) de todos os usuários a quem U tenha repassado esse(s) privilégio(s)

  5. Obs: no padrão SQL2 este efeito é conseguido acrescentando a palavra reservada cascade; se, no entanto,  a palavra reservada  restrict fosse acrescentada, o comando falharia caso houvesse privilégios repassados por U a outros usuários.
  6. Privilégio(s) concedidos a todos os usuários via grant ...  to public só podem ser revogados de public. Isto implica que se o mesmo privilégio foi concedido individualmente a um usuário, ele continua retendo-o, pela regra 2 acima. Além disso, revogar de public não afeta privilégios outorgados a stored procedures.
  7. with grant option pode ser revogada sem afetar os privilégios recebidos no mesmo comando grant.

  8. Obs: isto pode causar uma possível inconsistência caso o usuário U de quem estamos revogando o grant option, tenha repassado  privilégios a outros usuários, e que os manteriam; veja os comentários acima sobre o tratamento dado pelo padrão SQL2.
Exemplos:

revoke privilégio(s) on [table] tablename from user(s) | procnames(s)| triggername(s)| rolename(s)

revoke execute on procedure myprocname from user(s) | procname(s) | triggername(s)

revoke rolename(s) from user(s)

revoke privilégio(s) on tablename(s) from rolename(s)

revoke grant option for privilegio(s) on tablename from user(s)

revoke insert, update on accounts from procedure money_transfer, act_maint trigger show_user

revoke grant option for select on departments from Ana