Estou trabalhando em algum recurso de restrição de acesso a dados no Oracle 11g e tenho lutado desde então.
O que eu quero alcançar é permitir que um grupo específico acesse apenas um determinado conjunto de dados e o resto não deve poder vê-los (ou tê-los em hash) ...
Vamos imaginar dois usuários
USER_JOHN e USER_TIMMY
As configurações de função para eles estão seguindo
USER_JOHN
- it_analyst
- sales_analyst
- read_all
USER_TIMMY
- risk_analyst
As funções %_ANALYST são apenas para fins de demonstração .. a única função importante neste caso é a função READ_ALL que permite que JOHN acesse os dados "privilegiados" ...
Exemplo de dados privilegiados (colunas marcadas com * são consideradas "privilegiadas"):
CLIENT_TABLE
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 8/1/1990 | Sesame Street | Male |
2 | Jane | 1/18/1976 | Corner Road | Female |
Quando um usuário (com READ_ALL) consulta esta tabela, quero que ele obtenha o mesmo conjunto de dados que você pode ver acima
USER_JOHN:$> SELECT * FROM client_table;
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 8/1/1990 | Sesame Street | Male |
2 | Jane | 1/18/1976 | Corner Road | Female |
Mas se um usuário sem essa função READ_ALL consultar esta tabela, ele deverá obter apenas dados não privilegiados em um formato legível ... veja abaixo
USER_TIMMY:$> SELECT * FROM client_table;
-------------------------------------------------------------
ID | Name | Date of Birth * | Address * | Sex |
-------------------------------------------------------------
1 | Franco | 3978005636 | 4259532014 | Male |
2 | Jane | 2282325776 | 1146039631 | Female |
Como você pode ver, esses registros "privilegiados" são hash ... eles podem até estar vazios ou não selecionáveis.
USER_TIMMY:$> SELECT * FROM client_table;
--------------------------
ID | Name | Sex |
--------------------------
1 | Franco | Male |
2 | Jane | Female |
Existe alguma solução para conseguir isso? O melhor resultado para mim seriam valores com hash.... Li algo sobre Oracle VPD que deveria fazer o mesmo eu só não sei, como aplicar isso em papéis globalmente...
O que fiz até agora é que criei o mesmo objeto dentro de um esquema diferente...
SCHEMA_RAW.CLIENT_TABLE -> acessível para READ_ALL; não acessível para outros SCHEMA_HASHED.CLIENT_TABLE -> acessível para todos
Eu sei que não é a melhor solução, mas pelo menos eu tenho alguma proteção de dados implementada .. a grande desvantagem desta solução é o compartilhamento de script .. se houver um usuário que tenha acesso apenas a SCHEMA_RAW .. eles precisam mudar o script fornecido por usuários que têm acesso apenas a SCHEMA_HASHED ...
Nota: não existe apenas esta tabela única... existem muitas (centenas delas) que precisam ser protegidas desta forma...
EDIT: Oracle Database 11g Enterprise Edition Versão 11.2.0.4.0 - 64 bits
encontrei ...
RESPOSTA: Mascaramento e Subconfiguração de Dados Oracle
https://www.oracle.com/technetwork/database/options/data-masking-subsetting/overview/index.html