2010-02-14 8 views
3

TaskOracle Row niveau de sécurité dans l'application multi-locataires/valeurs par défaut pour les nouveaux enregistrements

Retrofit une application existante à utiliser une approche multi-locataire. Il doit être possible de créer des locataires et la session de chaque utilisateur doit référencer exactement un locataire actif. Chaque locataire ne devrait pouvoir voir et mettre à jour sa partition du schéma de base de données.

approche

  • Créer un contexte d'application Oracle qui contient l'identifiant du locataire
  • Ajouter une colonne id locataire à une table qui devrait être SCOPED
  • créer une fonction sous-jacente qui retourne « tenant_id = sys_context ('tenant_context', 'tenant_id') "pour SELECT, INSERT, UPDATE et supprimer
  • Ajouter une politique appropriée via dbms_rls pour enregistrer la fonction de prédicat

Cela fonctionne comme un charme sans toucher l'application existante pour SELECT, UPDATE et DELETE

Question

Lors de l'insertion de la colonne de tenant_id ne se fixe pas et une exception de sécurité arrive. Existe-t-il un moyen aussi élégant que la fonction de prédicat de toujours définir les champs liés à la sécurité? Je préfère ne pas ajouter de triggers à plus de 300 tables.

Répondre

3

Parfois, poser une question fournit la réponse. Je ne savais pas que vous pouvez utiliser des expressions non constantes dans les valeurs par défaut de la colonne, de sorte

alter table XXX 
add column tenant_id default sys_context('tenant_context', 'tenant_id'); 

résout effectivement mon problème.