J'essaie d'insérer certaines valeurs dans la table via l'application et d'obtenir le problème ORA-00001: contrainte unique violée . Je constate que les séquences ne sont pas synchronisées avec l'id le plus élevé de la table, l'erreur persiste toujours. Comment puis-je déboguer cette erreur plus, les journaux Oracle donnent-ils plus d'erreur? Comment puis-je voir les journaux Oracle? Merci Priyank
update: nous utilisons le plug-in de journalisation d'audit et dans la classe de domaine pour l'utilisateur, nous saisissons l'événement de sauvegarde et enregistrons l'entrée dans le journal d'audit.
Donc, en classe utilisateur, nous faisons:
class User {
//some attributes, constraints, mappings
def onSave = {
Graaudit aInstance = new Graaudit();
aInstance.eventType= "GRA User Create"
aInstance.eventDescription = "GRA User Created"
aInstance.objectid = username
aInstance.objecttype = 'GRAUSER'
aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username
aInstance.withTransaction{
aInstance.save()
}
}
}
Lorsque nous n'avons pas le code ci-dessus dans l'événement onSave, l'utilisateur est créé avec succès.
Je suppose qu’il s’agit d’une transaction liée au hibernation que nous utilisons une instance, celle-ci mourant ou la transaction en cours mourant à cause de cette sauvegarde.
Si nous n'utilisons pas la transaction, nous obtenons une exception "org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"
Vous ne savez pas comment résoudre ce problème .. Merci
Le message d'erreur inclura le nom de la contrainte qui a été violée (il peut y avoir plus d'une contrainte unique sur une table). Vous pouvez utiliser ce nom de contrainte pour identifier la ou les colonnes sur lesquelles la contrainte unique est déclarée.
SELECT column_name, position
FROM all_cons_columns
WHERE constraint_name = <<name of constraint from the error message>>
AND owner = <<owner of the table>>
AND table_name = <<name of the table>>
Une fois que vous savez quelles colonnes sont affectées, vous pouvez comparer les données que vous essayez d'utiliser INSERT
ou UPDATE
avec les données déjà présentes dans le tableau pour déterminer la raison pour laquelle la contrainte est violée.
Cette erreur ORA est due à une violation de contrainte unique.
ORA-00001: contrainte unique (nom_contrainte) violée
Cela est dû à une tentative d'exécution d'une instruction INSERT ou UPDATE ayant créé une valeur en double dans un champ limité par un index unique.
Vous pouvez résoudre ce problème en modifiant la contrainte pour autoriser les doublons ou en supprimant la contrainte unique, ou vous pouvez modifier votre code SQL pour éviter les insertions en double.
Le message d'erreur d'Oracle devrait être un peu plus long. Cela ressemble habituellement à ceci:
ORA-00001: unique constraint (TABLE_UK1) violated
Le nom entre parenthèses est le nom de la constrait. Il vous dit quelle contrainte a été violée.
Le message d'erreur ressemble à ceci
Error message => ORA-00001: unique constraint (schema.unique_constraint_name) violated
ORA-00001 se produit dans les cas suivants: "une requête tente d'insérer une ligne" en double "dans une table". Une contrainte unique échoue. Par conséquent, la requête échoue et la ligne N'EST PAS ajoutée à la table. "
Solution:
Recherchez toutes les colonnes utilisées dans unique_constraint, par exemple, la colonne a, la colonne b, la colonne c, la colonne d crée collectivement unique_constraint, puis recherchez l'enregistrement à partir des données source dupliquées à l'aide des requêtes suivantes:
-- to find <<owner of the table>> and <<name of the table>> for unique_constraint
select *
from DBA_CONSTRAINTS
where CONSTRAINT_NAME = '<unique_constraint_name>';
Puis utilisez la requête de Justin Cave (collée ci-dessous) pour trouver toutes les colonnes utilisées dans unique_constraint:
SELECT column_name, position
FROM all_cons_columns
WHERE constraint_name = <<name of constraint from the error message>>
AND owner = <<owner of the table>>
AND table_name = <<name of the table>>
-- to find duplicates
select column a, column b, column c, column d
from table
group by column a, column b, column c, column d
having count (<any one column used in constraint > ) > 1;
vous pouvez supprimer cet enregistrement dupliqué de vos données source (ce qui était une requête de sélection dans mon cas particulier, comme je l'ai expérimenté avec "Insérer dans la sélection"), ou le modifier pour le rendre unique ou modifier la contrainte.