| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |