Vamos criar um usuário e uma tabela com alguns dados:
CREATE ROLE admin;
CREATE TABLE employee (empno int, ename text, address text, salary int, account_number text);
INSERT INTO employee VALUES
(1, 'john' , '2 down str' , 20000, 'HDFC-22001')
, (2, 'clark' , '132 south avn', 80000, 'HDFC-23029')
, (3, 'soojie', 'Down st 17th' , 60000, 'ICICI-19022')
;
Agora, vamos criar permissões em nível de coluna:
postgres=> \c postgres edb
You are now connected to database "postgres" as user "edb".
postgres=# grant select (empno, ename, address) on employee to admin;
GRANT
postgres=# \c postgres admin
You are now connected to database "postgres" as user "admin".
postgres=> select empno, ename, address, salary from employee;
ERROR: permission denied for table employee
postgres=> select empno, ename, address from employee;
empno | ename | address
-------+--------+---------------
1 | john | 2 down str
2 | clark | 132 south avn
3 | soojie | Down st 17th
Tudo está funcionando bem até agora.
Mas é possível no PostgreSQL criar uma regra mais complexa — em vez de restringir completamente o admin
usuário de ver a salary
coluna, por exemplo, para retornar NULL
valores para todas as linhas e mostrar o valor real na coluna de salário somente onde, por exemplo, ename = 'clark'
?
Em outras palavras, em vez de retornar um erro como no exemplo abaixo:
postgres=> select empno, ename, address, salary from employee;
ERROR: permission denied for table employee
Retorne o seguinte resultado:
empno | ename | address | salary
-------+--------+---------------+--------
1 | john | 2 down str | NULL
2 | clark | 132 south avn | 80000
3 | soojie | Down st 17th | NULL
Provavelmente, isso pode ser feito por meio de uma visualização, mas estou especificamente interessado em alcançar esse resultado usando regras simples, como as mostradas acima.
Se possível, agradeceria um exemplo.