|
Вопрос # 4 498/ вопрос открыт / |
|
Доброго времени.
Подскажите какое условие ставить триггеру на вставку, если на одном столбце используемой таблицы стоит ограничение unique, и имеются повторы. Таблица заливается программно из файла, убрать повторы нецелесообразно, с использованием ограничения программа вылетает на первом повторяющемся значении с ошибкой ...ограничение unique...не могу вставить повторяющийся ключ.
 |
Вопрос задал: 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 (статус: Посетитель), 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 (статус: Посетитель), 13 августа 2010, 06:52 [#5]:
SQL 2008, господа, я плохо разбираюсь в вопросе, выше я писал что триггер будет работать гораздо быстрее, нежели обрабатывать повторения из клиентского приложения. Прошу Вас поправить условие срабатывания триггера.
|
|
Вадим К (статус: Академик), 13 августа 2010, 10:19 [#6]:
Цитата (Crash_net):
я плохо разбираюсь в вопросе, выше я писал что триггер будет работать гораздо быстрее, нежели обрабатывать повторения из клиентского приложения
Рекомендую вначале попробовать хоть как то. Может быть скорость вполне удовлетворит.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Мережников Андрей (статус: Абитуриент), 13 августа 2010, 19:50 [#7]:
напишите как пробовали без триггера
|
|
Crash_net (статус: Посетитель), 14 августа 2010, 04:54 [#8]:
перед вставкой проверяю есть ли такое значение в столбце под ограничением.
|
|
Мережников Андрей (статус: Абитуриент), 14 августа 2010, 06:49 [#9]:
как именно проверяете??? Какой запрос отправляете на сервер и что делаете с его результатами дальше? Приведите код.
|
|
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 (статус: Посетитель), 22 августа 2010, 16:38 [#12]:
except будет пропускать транзакцию? или откатывать?
|
|
Вадим К (статус: Академик), 22 августа 2010, 18:09 [#13]:
не знаю, что такое "пропускать транзакцию", но откатывать ее без четких указаний не будет. Транзакциями управляют ручками - они существуют сами по себе.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Crash_net (статус: Посетитель), 23 августа 2010, 03:50 [#14]:
в предложенном вами варианте при ограничении unique выполнение программы будет прерываться в первом же повторе, с сообщением "...нельзя вставить повторяющийся ключ..."
|
|
Мережников Андрей (статус: Абитуриент), 23 августа 2010, 21:24 [#15]:
конечно будет прерываться, если запускать программу из под Delphi с включенным параметром параметром - Notify on language exception. Надо либо отключить эту опцию, либо запускать exe файл программы
|
|
Crash_net (статус: Посетитель), 24 августа 2010, 06:59 [#16]:
попробывал, та же история и с exe'шником, вываливается на месте повтора
|
|
Вадим К (статус: Академик), 24 августа 2010, 10:23 [#17]:
Ну тогда нужно показывать полный код. Может там не экранируется в достаточной мере.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|