Não tente duplicar conjuntos de direitos como este, isso se tornará um pesadelo gerencial. Use papéis e herança.
Em vez disso, crie um ROLE
(group) e torne ambos os usuários membros da função. Conceda à função os direitos necessários e a propriedade de quaisquer objetos exigidos, e os usuários herdarão automaticamente esses direitos de acesso.
Para fazer a transição:
-
Transforme o usuário existente na função compartilhada renomeando-o e descartando seu
LOGIN
para a direita, transformando-o de uma função de login (usuário) em uma função de não-login (grupo) e crie um novo usuário o nome original; ou -
Manualmente
GRANT
da nova função todos os direitos necessários, usandoGRANT ... ON DATABASE
,GRANT ... ON SCHEMA
,GRANT ... ON ALL TABLES IN SCHEMA
, etc.
Aqui está uma demonstração da primeira abordagem. Digamos que temos um usuário original chamado test
com a propriedade de uma tabela e algumas outras concessões:
regress=# CREATE USER test WITH PASSWORD 'original user pw';
CREATE ROLE
regress=# CREATE TABLE testtab(x integer);
CREATE TABLE
regress=# ALTER TABLE testtab OWNER TO test;
ALTER TABLE
Podemos convertê-lo para uma função compartilhada e criar um novo usuário com o mesmo nome:
regress=# ALTER ROLE test RENAME TO test_group;
NOTICE: MD5 password cleared because of role rename
ALTER ROLE
regress=# ALTER ROLE test_group NOLOGIN;
ALTER ROLE
regress=# CREATE USER test IN GROUP test_group PASSWORD 'original user pw';
CREATE ROLE
Contanto que você defina a mesma senha, o usuário não notará a diferença.
Agora você pode criar um novo usuário e adicioná-lo à mesma função, fornecendo o mesmo acesso que o usuário test
original tinha antes de transformá-lo na função test_group
. Nesse caso, estou usando as etapas separadas de criação de um usuário e, em seguida, concedendo a ele uma associação de função; o efeito é o mesmo que o acima, estou mostrando duas maneiras diferentes de fazer isso:
regress=# CREATE USER newuser PASSWORD 'fred';
CREATE ROLE
regress=# GRANT test_group TO newuser;
GRANT ROLE
Agora, newuser
can SELECT * FROM testtab
, apesar de testtab
pertencer ao usuário test
e não ter GRANT
s para permitir que outros usuários o acessem.