Ajouter une politique d'accès au niveau ligne avec VPD (DBMS_RLS)
OracleSécuritéCommande
-- 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');Ce que fait la commande
Virtual Private Database ajoute automatiquement le prédicat WHERE renvoyé par la fonction de politique à chaque SQL sur la table, de sorte que les utilisateurs d'une même table ne voient/modifient que les lignes auxquelles ils ont droit. update_check=>TRUE empêche un utilisateur de mettre à jour une ligne vers une valeur qu'il ne pourrait pas voir.
Quand l'utiliser
Dans les applications multi-tenant, pour l'isolation des données par région/agence, et pour ajouter une sécurité au niveau ligne sans toucher au code applicatif.
Attention
Inclus dans Enterprise Edition, aucune licence supplémentaire. CLIENT_IDENTIFIER peut être défini librement par le client ; en production, utilisez un application context défini par un package de confiance (CREATE CONTEXT ... USING). SYS et les utilisateurs ayant EXEMPT ACCESS POLICY contournent la politique ; les exports Data Pump sans ce privilège exportent silencieusement des données partielles. Une erreur dans la fonction bloque tout accès avec ORA-28112. Un mauvais policy_type (par ex. STATIC) met le prédicat en cache et renvoie des résultats faux.
Voir aussi
- Créer, ouvrir, définir la clé maître et sauvegarder un keystore TDE (19c+)
- Chiffrer des tablespaces avec TDE (nouveaux et existants, en ligne/hors ligne)
- Créer une politique Unified Auditing, l'activer sous condition, consulter les enregistrements, la supprimer
- Créer un profil de politique de mots de passe et l'attribuer aux utilisateurs
- Trouver les privilèges inutilisés avec privilege analysis