![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить ошибки в тригере [MSSQL]
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]некрасиво спамить несколько форумов сразу...