Adicionar uma política de acesso em nível de linha com VPD (DBMS_RLS)
OracleSegurançaComando
-- 1) Policy function returning the predicate:
CREATE OR REPLACE FUNCTION customer_app.customer_vpd_fn (
p_schema IN VARCHAR2,
p_object IN VARCHAR2
) RETURN VARCHAR2
AS
BEGIN
-- The schema owner sees all rows (NULL = no restriction)
IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'CUSTOMER_APP' THEN
RETURN NULL;
END IF;
-- Other users see only their own city
RETURN 'city = SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'')';
END;
/
-- 2) Attach the policy to the table:
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'CUSTOMER_APP',
object_name => 'CUSTOMER',
policy_name => 'CUSTOMER_CITY_VPD',
function_schema => 'CUSTOMER_APP',
policy_function => 'CUSTOMER_VPD_FN',
statement_types => 'SELECT, UPDATE, DELETE',
update_check => TRUE,
policy_type => DBMS_RLS.CONTEXT_SENSITIVE);
END;
/
-- 3) Check:
SELECT object_owner, object_name, policy_name, function,
sel, upd, del, chk_option, enable, policy_type
FROM dba_policies WHERE object_owner = 'CUSTOMER_APP';
-- Test (as the application user): EXEC DBMS_SESSION.SET_IDENTIFIER('Ankara');
-- 4) Temporarily disable / drop:
EXEC DBMS_RLS.ENABLE_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD', FALSE);
EXEC DBMS_RLS.DROP_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD');O que faz
O Virtual Private Database acrescenta automaticamente o predicado WHERE retornado pela função da política a todo SQL contra a tabela, para que usuários da mesma tabela vejam/alterem apenas as linhas a que têm direito. update_check=>TRUE impede que um usuário atualize uma linha para um valor que ele não poderia ver.
Quando usar
Em aplicações multi-tenant, para isolamento de dados por região/filial e para adicionar segurança em nível de linha sem mexer no código da aplicação.
Atenção
Incluído no Enterprise Edition, sem licença extra. CLIENT_IDENTIFIER pode ser definido livremente pelo cliente; em produção use um application context definido por um pacote confiável (CREATE CONTEXT ... USING). SYS e usuários com EXEMPT ACCESS POLICY ignoram a política; exports do Data Pump sem esse privilégio exportam dados parciais silenciosamente. Um erro na função bloqueia todo acesso com ORA-28112. Um policy_type errado (ex.: STATIC) faz cache do predicado e retorna resultados errados.
Relacionados
- Criar, abrir, definir a master key e fazer backup de um keystore TDE (19c+)
- Criptografar tablespaces com TDE (novos e existentes, online/offline)
- Criar uma política de Unified Auditing, habilitá-la com condição, revisar os registros e removê-la
- Criar um profile de política de senhas e atribuí-lo a usuários
- Encontrar privilégios não utilizados com privilege analysis