Recebi um email falando que o usuário estava tentando realizar um delete e já tinha sido concedido o privilégio de delete na tabela em questão, mas mesmo assim não estava conseguindo.
Depois de entender a situação, achei interessante compartilhar o conteúdo porque é um conceito básico de banco de dados.
Em um ambiente de testes, repliquei a situação para ficar mais fácil de entender.
1) Criei uma tabela de testes e inseri registros.
create table thiago.tb_teste (id number,a varchar2(10)); insert into thiago.tb_teste values (1,'Thiago'); insert into thiago.tb_teste values (2,'Thiago'); insert into thiago.tb_teste values (3,'Thiago'); insert into thiago.tb_teste values (4,'Thiago'); insert into thiago.tb_teste values (5,'Thiago'); commit; |
2) Criei o usuário user_delete e dei permissão para deletar na tabela tb_teste
create user user_delete identified by "user"; grant create session to user_delete; grant delete on thiago.tb_teste to user_delete; |
3) Porém quando tentei excluir, recebi o erro.
Conectado a: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL> show user; USER "USER_DELETE" SQL> delete thiago.tb_teste where id=3; delete thiago.tb_teste where id=3 * ERRO na linha 1: ORA-01031: privilégios insuficientes |
4) Executei o DELETE, porém sem a cláusula WHERE e dessa vez rodou.
Conectado a: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL> show user; USER "USER_DELETE" SQL> delete thiago.tb_teste; 5 linhas excluídas. |
5) Isso ocorre porque quando usamos o WHERE no DELETE, é realizado um SELECT implicito e por essa razão, precisamos dar o privilégio de SELECT além do DELETE.
Abaixo, após conceder os privilégios necessários, conseguimos realizar o delete com sucesso.
SQL> grant delete,select on thiago.tb_teste to user_delete; SQL> delete thiago.tb_teste where id=3; 1 linha excluída. |
Comentários