SP para controlar acesso de usuário em novas tabelas
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:
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??
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
Curtidas 0
Melhor post
Ana Lichirgu
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!
Isso resolveria seu problema...
Espero ter ajudado!
GOSTEI 2
Mais Respostas
Artur Barth
18/03/2019
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;
GOSTEI 1
Talisrander Santos
18/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!
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!
GOSTEI 0