Fórum SP para controlar acesso de usuário em novas tabelas #601260
18/03/2019
0
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??

Talisrander Santos
Curtir tópico
+ 0Post mais votado
19/03/2019
Isso resolveria seu problema...
Espero ter ajudado!
Ana Lichirgu

Gostei + 2
Mais Posts
19/03/2019
Artur Barth
CREATE OR ALTER TRIGGER RDB$RELATIONS_AI0 FOR RDB$RELATIONS ACTIVE AFTER INSERT POSITION 0 AS begin /* CHAMAR SUA SP AQUI */ end;
Gostei + 1
21/03/2019
Talisrander Santos
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^
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!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)