Оператор SQL не удалось в ATG
Я работаю в приложении ATG. Сегодня я получил следующее исключение SQL в /atg/userprofiling/ProfileAdapterRepository, и это из-за нарушения ограничения уникальности.
atg.repository.RepositoryException; SOURCE:java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (DCS_USR_ACTVPROM_P) violated
Исключение возникает, когда выполняется запрос вставки для пользовательской таблицы продвижения dcs_usr_actvpromo ATG. Я искал, когда и где выполняется этот запрос, какие значения передаются, но я не смог найти до сих пор.
МетодhandleLogin объекта atg.scenario.userprofiling.ScenarioProfileFormHandler был вызван из пользовательского FormHandler. Я не смог найти поток после вызова этого метода. После этого вызова метода возникает исключение.
Может кто-нибудь сообщить мне, что происходит внутри этого метода и откуда SQL-запросы выполняются в ATG для приведенной выше таблицы, пожалуйста?
1 ответ
Вы не добавили фактический sql, который пытаетесь запустить, но сообщение об ошибке в значительной степени говорит обо всем. Вы нарушаете unique
ограничение.
Предположим, у вас есть таблица Foo
и у вас есть unique
колонка, называемая bar
, Если вы намереваетесь вставить запись в Foo
, иметь bar
ценность 'loremipsum'
, тогда утверждение не будет успешным, если ваш Foo
таблица уже имеет запись, где bar
имеет значение 'loremipsum'
,
В результате insert
из:
insert into Foo(bar)
values('loremipsum');
есть риск провала. Чтобы предотвратить этот риск, вы должны проверить, существует ли уже значение, например:
insert into Foo(bar)
select 'loremipsum'
from Foo
where 'loremipsum' not in (select distinct bar from Foo)