SP para controlar acesso de usuário em novas tabelas

18/03/2019

10

Olá galera tudo bom?
Preciso de ajuda com uma questão, estou trabalhando em cima de um store procedure que visa dar permissões de leitura a todas as tabelas do sistema, até o momento está rodando OK, mas tem um porém: caso o SYSDBA adicione novas tabelas o usuário não terá acesso as mesmas sem o SYSDBA rodar novamente a procedure. Abaixo a SP:
begin
 i_user = 'acesso';
 v_sql = '';
 v_sql = 'create user ' || i_user || ' password ''acesso'' grant admin role';
 EXECUTE STATEMENT v_sql;

 v_sql = '';
 v_sql = 'grant rdb$admin to ' || i_user || ';';
 EXECUTE STATEMENT v_sql;
 for
  select rdb$relations.rdb$relation_name
  from rdb$relations
  where rdb$relations.rdb$flags = 1
  into :v_objeto
 do
 begin
  v_sql = '';
  v_sql = 'GRANT select ON ' || v_objeto || ' TO ' || i_user;
  EXECUTE STATEMENT v_sql;
 end

 for
  select rdb$procedures.rdb$procedure_name
  from rdb$procedures
  into :V_objeto
 do
 begin
  v_sql = '';
  v_sql = 'GRANT EXECUTE ON PROCEDURE ' || v_OBJETO || ' TO ' || i_user;
  EXECUTE STATEMENT v_sql;
  end

Todas as novas tabelas obrigatoriamente serão criadas com SYSDBA, então como comparar as tabelas que o SYSDBA tem permissão de SELECT (RDB$PRIVILEGE = S) e o novo usuário não tem?
Seria simples, mas.....preciso fazer com que o sistema busque e encontre as novas tabelas do sistema e aplique a permissão de GRANT SELECT somente nas novas tabelas, sem ter que reaplicar o GRANT ao restante que já tem permissão. Sim também acho mais fácil só reaplicar o grant em tudo, masssss....
Como proceder??
Responder

Post mais votado

19/03/2019

Bom dia! Porque você não cria uma trigger que executa a procedure toda vez que uma nova tabela for criada?

Isso resolveria seu problema...

Espero ter ajudado!
Responder

Mais Posts

19/03/2019

Artur Barth

Seguindo a ideia da Ana. É só criar uma trigger na tabela RDB$RELATIONS

CREATE OR ALTER TRIGGER RDB$RELATIONS_AI0 FOR RDB$RELATIONS
ACTIVE AFTER INSERT POSITION 0
AS
begin
  /* CHAMAR SUA SP AQUI */
end;
Responder
Bom dia! Porque você não cria uma trigger que executa a procedure toda vez que uma nova tabela for criada?
Isso resolveria seu problema...
Espero ter ajudado!


Ana obrigado pela dica fiz essa procedure que faz a verificação e grants e a trigger em uma tabela específica do sistema, deu certinho fico agradecido!!
SET TERM ^ ;
create or alter procedure SP_SYS_PERMISSOES_USUARIO_BD (
    I_USER varchar(64))
as
declare variable V_SQL varchar(1024);
declare variable V_OBJETO varchar(512);
begin
V_SQL = '''';
  for select R.RDB$RELATION_NAME
      from RDB$RELATIONS R
      left join RDB$USER_PRIVILEGES UP on UP.RDB$RELATION_NAME = R.RDB$RELATION_NAME
      and UP.RDB$USER = :I_USER
      where R.RDB$FLAGS = 1 and
            UP.RDB$USER is null
      into :V_OBJETO
  do
  begin
    V_SQL = '''';
    V_SQL = ''GRANT select ON '' || V_OBJETO || '' TO '' || I_USER;
    execute statement V_SQL;
  end
 
  for select RDB$PROCEDURES.RDB$PROCEDURE_NAME
      from RDB$PROCEDURES
      into :V_OBJETO
  do
  begin
    V_SQL = '''';
    V_SQL = ''GRANT EXECUTE ON PROCEDURE '' || V_OBJETO || '' TO '' || I_USER;
    execute statement V_SQL;
  end
end^


Seguindo a ideia da Ana. É só criar uma trigger na tabela RDB$RELATIONS


Artur fiz a trigger dessa forma, com algumas personalizações e melhora no index.
SET SQL DIALECT 3;
SET TERM ^ ;
 
CREATE OR ALTER TRIGGER SYS_BANCO_BUILD_AI0 FOR SYS_BANCO_BUILD
ACTIVE AFTER INSERT POSITION 0
as
begin
  execute procedure SP_SYS_PERMISSOES_USUARIO_BD(select
  upper (SC.USUARIO_BD_READ_ONLY) from SYS_CONFIGURACAO SC
where SC.id_sys_configuracao = ''1'');
end
^
SET TERM ; ^

Muito agradecido pela ajuda de vocês! Tópico pode ser fechado!
Beijos no s2!
Responder