Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 498

/ вопрос открыт /

Доброго времени.

Подскажите какое условие ставить триггеру на вставку, если на одном столбце используемой таблицы стоит ограничение unique, и имеются повторы. Таблица заливается программно из файла, убрать повторы нецелесообразно, с использованием ограничения программа вылетает на первом повторяющемся значении с ошибкой ...ограничение unique...не могу вставить повторяющийся ключ.

Приложение:
  1. create trigger trg1
  2. on table1
  3. for insert
  4. as
  5.  
  6. rollback transaction
  7. go
  8.  


Crash_net Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Crash_net (статус: Посетитель)
Вопрос отправлен: 11 августа 2010, 16:09
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 34; последнее сообщение — 13 сентября 2010, 15:44; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 11 августа 2010, 16:20 [#1]:

Если записи заливаются по одной, то может поможет try - except ?
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 11 августа 2010, 20:31 [#2]:

что значит:

Цитата (Crash_net):

убрать повторы нецелесообразно
?
их все равно придется убирать, либо убирать ограничение unique. Если хотите проводить проверку на стороне сервера, то лучше использовать не триггер, а хранимую процедуру для вставки записи в таблицу. В программе вызывать на выполнение ХП (с параметрами новой записи), а в ХП проверять существование записи с повторяющимся значением ключа. Если нужен результат - удачно/неудачно завершилась вставка, то для этого можно использовать возвращаемое ХП значение.
Если проверка может быть на стороне клиента, тогда два варианта: 1) делать запрос на существование записи, затем добавлять; 2) использовать совет Вадима К с try except. Но надо помнить, что except может возникнуть не только из-за повтора уникального ключа.
Crash_net

Crash_net (статус: Посетитель), 12 августа 2010, 12:28 [#3]:

1 вариант уже работает, но работает слишком долго, как понял из мануала (впервые сталкиваюсь с БД вообще) отработка в триггрере будет значительно быстрее.
Что здесь не так?
if NOT exists(select * from Table1, inserted where Table1.name_count=inserted.name_count) RETURN

-----------------------------------------------------
при таком условии триггер постоянно возвращает транзакцию(
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 13 августа 2010, 05:57 [#4]:

какая СУБД? Триггер - это разновидность хранимой процедуры со специфическими свойствами. Дайте ссылку на мануал, в котором написано, что триггер работает значительно быстрее хранимой процедуры. Приведите текст ХП, которую используете.
Crash_net

Crash_net (статус: Посетитель), 13 августа 2010, 06:52 [#5]:

SQL 2008, господа, я плохо разбираюсь в вопросе, выше я писал что триггер будет работать гораздо быстрее, нежели обрабатывать повторения из клиентского приложения. Прошу Вас поправить условие срабатывания триггера.
Вадим К

Вадим К (статус: Академик), 13 августа 2010, 10:19 [#6]:

Цитата (Crash_net):

я плохо разбираюсь в вопросе, выше я писал что триггер будет работать гораздо быстрее, нежели обрабатывать повторения из клиентского приложения

Рекомендую вначале попробовать хоть как то. Может быть скорость вполне удовлетворит.
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 13 августа 2010, 19:50 [#7]:

напишите как пробовали без триггера
Crash_net

Crash_net (статус: Посетитель), 14 августа 2010, 04:54 [#8]:

перед вставкой проверяю есть ли такое значение в столбце под ограничением.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 14 августа 2010, 06:49 [#9]:

как именно проверяете??? Какой запрос отправляете на сервер и что делаете с его результатами дальше? Приведите код.
Crash_net

Crash_net (статус: Посетитель), 19 августа 2010, 09:45 [#10]:

ADOQuery1.SQL.Add('select count(*) as CNT from Table1 where inv =' + '''' + mas + '''');
ADOQuery1.Open;
if ADOQuery1.FieldByName('CNT').Value = 0
then begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert into FromFeo values('...,mas,...');
try
ADOQuery1.ExecSQL;
finally
end;
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 19 августа 2010, 18:21 [#11]:

из всего текста можно оставить так:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert into FromFeo values('...,mas,...');
try
ADOQuery1.ExecSQL;
except
//какая-то ошибка при добавлении
//в том числе нарушение уникальности
end;
это будет вариант, предложенный Вадимом К
Crash_net

Crash_net (статус: Посетитель), 22 августа 2010, 16:38 [#12]:

except будет пропускать транзакцию? или откатывать?
Вадим К

Вадим К (статус: Академик), 22 августа 2010, 18:09 [#13]:

не знаю, что такое "пропускать транзакцию", но откатывать ее без четких указаний не будет. Транзакциями управляют ручками - они существуют сами по себе.
Галочка "подтверждения прочтения" - вселенское зло.
Crash_net

Crash_net (статус: Посетитель), 23 августа 2010, 03:50 [#14]:

в предложенном вами варианте при ограничении unique выполнение программы будет прерываться в первом же повторе, с сообщением "...нельзя вставить повторяющийся ключ..."
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 23 августа 2010, 21:24 [#15]:

конечно будет прерываться, если запускать программу из под Delphi с включенным параметром параметром - Notify on language exception. Надо либо отключить эту опцию, либо запускать exe файл программы
Crash_net

Crash_net (статус: Посетитель), 24 августа 2010, 06:59 [#16]:

попробывал, та же история и с exe'шником, вываливается на месте повтора
Вадим К

Вадим К (статус: Академик), 24 августа 2010, 10:23 [#17]:

Ну тогда нужно показывать полный код. Может там не экранируется в достаточной мере.
Галочка "подтверждения прочтения" - вселенское зло.
Crash_net

Crash_net (статус: Посетитель), 24 августа 2010, 13:58 [#18]:

"ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert into FromFeo values('...,mas,...');
try
ADOQuery1.ExecSQL;
except
//какая-то ошибка при добавлении
//в том числе нарушение уникальности
end;"

в этом случае в except нужно еще что-то добавлять (типа rollback...)
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 24 августа 2010, 19:54 [#19]:

может ошибка возникает до входа в блок try except?
транзакциями вручную в ADO управляют так:
старт транзакции: ADOConnection.BeginTrans
откат транзакции: ADOConnection.rollbackTrans
подтверждение: ADOConnection.committrans
Вадим К

Вадим К (статус: Академик), 7 сентября 2010, 11:19 [#20]:

select (тут список полей через запятую, которые нужны) from (тут через запятую имена двух таблиц) where таблица1.ключевое_поле=таблица2.ключевое_поле

если в таблицах есть одинаковые поля и возникает неоднозначность, то нужно записывать в виде имя_таблицы точка имя_поля
Галочка "подтверждения прочтения" - вселенское зло.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.02 сек.