Question

Je travaille sur une application qui utilise Oracle construit dans les mécanismes d'authentification pour gérer les comptes d'utilisateur et les mots de passe. L'application utilise également la sécurité au niveau de la ligne. En principe, chaque utilisateur qui enregistre par l'application reçoit un nom d'utilisateur et mot de passe Oracle au lieu de l'entrée typique dans une table « utilisateurs ». Les utilisateurs reçoivent également des étiquettes sur certaines tables. Ce type de fonctionnalité exige que l'exécution des instructions DML et DDL être combinés dans de nombreux cas, mais cela pose un problème parce que les déclarations implicites DDL effectuer des validations. Si une erreur se produit après une instruction DDL a exécuté, la gestion des transactions ne roulera pas tout retour. Par exemple, lorsqu'un nouvel utilisateur enregistre avec le système ci-après pourrait avoir lieu:

  1. transaction Debut
  2. Insérer les détails de la personne dans une table. (À savoir le prénom, le nom, etc.) -DML
  3. Créer un compte Oracle (créer testuser utilisateur identifié par mot de passe;) -DDL engagement implicite. fin de la transaction.
  4. La nouvelle transaction commence.
  5. Effectuer plus statments DML (inserts, mises à jour, etc.).
  6. Une erreur se produit, la transaction ne roule retourne à l'étape 4.

Je comprends que la logique ci-dessus fonctionne comme prévu, mais je trouve qu'il est difficile de test unitaire ce type de fonctionnalité et de le gérer dans la couche d'accès aux données. J'ai eu la base de données ou descendre erreurs se produisent lors des tests unitaires qui ont causé le schéma de test pour être contaminé par des données d'essai qui aurait dû être annulée. Il est assez facile d'essuyer le schéma de test quand cela arrive, mais je suis inquiet au sujet des échecs de base de données dans un environnement de production. Je cherche des stratégies pour gérer cela.

Ceci est une application Java / Spring. Spring fournit la gestion des transactions.

Était-ce utile?

La solution

Vous devez utiliser l'authentification proxy Oracle en combinaison avec la sécurité au niveau de la ligne.

Lire ceci: http://www.oracle. com / technologie / pub / articles / dikmans-TopLink-security.html

Autres conseils

Tout d'abord, je dois dire: mauvaise idée qu'il faire de cette façon. Pour deux raisons:

  1. Les connexions sont basées sur l'utilisateur. Cela signifie que vous perdez en grande partie les avantages de la mise en commun de connexion. Elle n'échelle pas très bien. Si vous avez 10.000 utilisateurs sur à la fois, vous allez être constamment ouvrir et fermer les connexions difficiles (plutôt que les pools de connexions souples); et
  2. Comme vous l'avez découvert, la création et la suppression d'utilisateurs est pas DML et DDL donc vous perdez « transactionnalité ».

Je ne sais pas pourquoi vous avez choisi de le faire, mais je voudrais fortement vous recommandons de mettre en œuvre les utilisateurs à l'application et non la couche de base de données.

En ce qui concerne la façon de résoudre votre problème, vous pouvez pas fondamentalement. Comme si vous créez une table ou un index au milieu de votre séquence.

Je suis en désaccord avec certains des commentaires précédents et dire qu'il ya beaucoup d'avantages à l'utilisation de la sécurité intégrée du compte Oracle. Si vous devez augmenter cela avec une sorte de table ombre des utilisateurs avec des informations supplémentaires, que diriez-vous envelopper la création de compte Oracle dans un package distinct qui est déclaré PRAGMA AUTONOMOUS_TRANSACTION et retourne un état sucess / défaut de l'emballage qui fait l'insert dans la table d'ombre? Je crois que ce serait isoler la création du compte Oracle de la transaction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top