Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить ошибки в тригере [MSSQL]


Страницы:   1 2

Helen ©   (2007-04-05 10:45:00) 

Добрый день. У меня такая проблемс: есть приложение (написано не мной), которое пишет данные в MS SQL 2000. У таблице, в которую пишутся данные, создан тригер instead of insert. Данные пишутся-пишутся, а потом вдруг приложение выдает ошибку:
Ошибка записи в БД: Could not find prepared statement with handle -1.
И все, данные перестают писаться, перезапуск программы не помогает. После удаления и повторного создания тригера все опять работает, т.е. дело в тригере. Вопрос: как узнать, по какой причине он зависает?


Helen   (2007-04-06 09:00:00) [21]

1.
Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)
May  3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)


2.
CREATE trigger LoadAvarRow
on Table1 instead of insert
as
 
 SET DATEFORMAT dmy
 DECLARE @Err varchar(3), @ErType varchar(1)
 DECLARE @Region varchar(3), @AtsNum varchar(3), @Adr1 varchar(3), @Adr2 varchar(3), @Adr3 varchar(3)
 DECLARE @Date varchar(17), @DateIns varchar(17)

 SELECT @DateIns=ins.DATTIME, @Region=ins.REGION, @AtsNum=ins.ATSNUM, @Adr1=ins.ADR1, @Adr2=ins.ADR2, @Adr3=ins.ADR3, @Err=ERCODE, @ErType=ins.ERTYPE
   FROM inserted as ins

 SET @Date=SUBSTRING(@DateIns, 7, 2)+'.'+SUBSTRING(@DateIns, 4, 2)+'.'+SUBSTRING(@DateIns, 1, 2)+' '+SUBSTRING(@DateIns, 10, 8)

 IF @Err IN (...)
 BEGIN
   rollback TRAN
   RETURN
 END

 IF @Err IN (...)
 BEGIN

   IF not EXISTS(Select *
          From temp_CurrAvar
                 Where REGION=@Region and ATSNUM=@AtsNum and ADR1=@Adr1 and ADR2=@Adr2 and ErrBegin=@Err and DateEnd is Null)
   BEGIN
     INSERT INTO temp_CurrAvar (REGION, ATSNUM, ADR1, ADR2, ErrBegin, DateBegin)
       VALUES(@Region, @AtsNum, @Adr1, @Adr2, @Err, @Date)    

     INSERT INTO Table1 VALUES (@DateIns, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3, @ErType)

     COMMIT TRAN
     RETURN
   END else begin
rollback TRAN
       RETURN
   end
 END

 IF @Err IN (...)
 BEGIN
   DECLARE @ErrBegin varchar(3)

   SET @ErrBegin=CASE @Err
               WHEN '150' THEN '151'
 WHEN '133' THEN '131'
 WHEN '132' THEN '130'
 WHEN '160' THEN '127'
 WHEN '163' THEN '134'
 WHEN '165' THEN '136'
 WHEN '162' THEN '129'
 WHEN '161' THEN '128'
 END

   IF EXISTS(Select *
      From temp_CurrAvar
      Where (REGION=@Region) and (ATSNUM=@AtsNum) and (ADR1=@Adr1) and (ADR2=@Adr2) and (ErrBegin=@ErrBegin) and (ErrEnd is Null))
   BEGIN
       UPDATE temp_CurrAvar
       SET DateEnd=@Date, ErrEnd=@Err
       WHERE REGION=@Region and ATSNUM=@AtsNum and ADR1=@Adr1 and ADR2=@Adr2 and ErrBegin=@ErrBegin and (ErrEnd is Null)
 
INSERT INTO MO_ERLST VALUES (@DateIns, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3, @ErType)

COMMIT TRAN
       RETURN
   END ELSE BEGIN
       rollback TRAN
       RETURN
   END
  END

 IF @Err IN (...)
 BEGIN
   INSERT INTO Table2
        (DATTIME, ERCODE, REGION, ATSNUM, ADR1, ADR2, ADR3)
   VALUES (@Date, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3 )    

   INSERT INTO Table1 VALUES (@DateIns, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3, @ErType)

   COMMIT TRAN
   RETURN
 END

 IF @Err IN (...)
 BEGIN
   INSERT INTO temp_139 (REGION, ATSNUM, ADR1, ADR2, ADR3, ERCODE, ERCOUNT, DATTIME)
   VALUES(@Region, @AtsNum, @Adr1, @Adr2, @Adr3, @Err, 1, @Date)
     
   INSERT INTO Table1 VALUES (@DateIns, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3, @ErType)

   COMMIT TRAN
   RETURN
 END

 INSERT INTO Table1 VALUES (@DateIns, @Err, @Region, @AtsNum, @Adr1, @Adr2, @Adr3, @ErType)

 COMMIT TRAN
RETURN


Jan1   (2007-04-05 17:37:00) [22]

1. Версия сервера: select @@version
2. Триггер покажите.


Helen   (2007-04-05 17:26:00) [23]

Нашла: Could not find prepared statement with handle %d.


Helen   (2007-04-05 17:25:00) [24]

Exception Error: 8179, Severity: 16, State: 1
что-то не могу найти, что за ошибка


Helen   (2007-04-05 17:12:00) [25]

Она появляется сама по себе. Сегодня почти целый день данные нормально писались. Только что появилась ошибка.


Jan1   (2007-04-05 16:52:00) [26]


> Helen   (05.04.07 16:49) [9]
>
> в смысле легко воспроизводима?

в смысле эта ошибка появляется сама по себе и выяснить когда нет возможности или Вы всегда можете ее повторить?


Helen   (2007-04-05 16:49:00) [27]

в смысле легко воспроизводима?


Jan1   (2007-04-05 16:45:00) [28]


> Helen   (05.04.07 16:42) [7]

ошибка легко воспроизводима?


Helen   (2007-04-05 16:42:00) [29]

>Тады проблемы не в триггере а в клиенте (о чем говорит и характер ошибки). Для очистки совести заглуши триггер и попробуй.

Я имела ввиду, что такой поток не могу создать руками. Если проблема не в тригере, то почему при его удалении и вновь создании опять начинается запись в таблицу. Пока не удалишь тригер программа отказывается писать данные, хотя соединение с сервером устанавливается?

>ЮЮ ©   (05.04.07 12:20) [5]
Такой скорострельный клиент только один. Программа собирает показания датчиков со всех компьютеров в сети и передает их в SQL-сервер.
>Запросы на запись  у "автоматчика" параметрические?-не знаю, программа не мной писана.


ANB   (2007-04-05 14:54:00) [30]


> инициировать работу триггера в QA, добавляя записи в таблицу
> пробовала, все проходило успешно
> Дело в том, что в основную таблицу пишется от 5 до 50 записей
> в секунду

Тады проблемы не в триггере а в клиенте (о чем говорит и характер ошибки). Для очистки совести заглуши триггер и попробуй.


ЮЮ   (2007-04-05 12:20:00) [31]

> Дело в том, что в основную таблицу пишется от 5 до 50 записей
> в секунду

И все клиенты такие скорострельныые?
Запросы на запись  у "автоматчика" параметрические?
А то между Query.Prepare; и Query.ExecSQL казалось бы Prepared запрос на серевере уже и не Prepared, на что наводит сообщение   "Could not find prepared statement"Правда "with handle -1"подозрителен.


Helen   (2007-04-05 12:05:00) [32]

инициировать работу триггера в QA, добавляя записи в таблицу пробовала, все проходило успешно
Дело в том, что в основную таблицу пишется от 5 до 50 записей в секунду


ANB   (2007-04-05 11:24:00) [33]


> Helen   (05.04.07 10:45)

1. Сделай триггер пустым - убедись что ничего не падает (есть подозрение, что не триггер виноват)
2. Если таки проблема в триггере, то :
  а) запости его исходник
  б) раставь по телу триггера принты и смотри, что получается (тута удобнее будет инициировать работу триггера в QA, добавляя записи в таблицу).


Helen   (2007-04-05 10:50:00) [34]

просто нужно очень быстро исправить ошибку


Jan1   (2007-04-05 10:48:00) [35]

некрасиво спамить несколько форумов сразу...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо