Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Есть таблица, в ней есть поля (колонки), которые приложением не устанавливаются, хотелось бы их заполнить триггером.
Привожу пример с обновлением полей IDDOC13, и IDDOC23.

Пишу такой триггер:
CREATE TRIGGER [dbo].[_1SJOURN_OnInsert] ON [dbo].[_1SJOURN]
AFTER INSERT, UPDATE
AS
BEGIN
	UPDATE
		_1SJOURN
	SET
		IDDOC13 = CASE WHEN IDDOCDEF < 46656 THEN ' '+RTRIM(dbo.Convert10To36(IDDOCDEF)) ELSE RTRIM(dbo.Convert10To36(IDDOCDEF)) END + IDDOC,
		IDDOC23 = 'O1'+CASE WHEN IDDOCDEF < 46656 THEN ' '+RTRIM(dbo.Convert10To36(IDDOCDEF)) ELSE RTRIM(dbo.Convert10To36(IDDOCDEF)) END + IDDOC + '        '
	WHERE IDDOC IN (SELECT Ins.IDDOC FROM Inserted AS Ins)
END

правильно ли написан триггер (потому что приложение вылетает с ошибкой в базе при попытке вставки).
1 дек 11, 17:05    [11691108]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
потому что приложение вылетает с ошибкой в базе при попытке вставки

А прочитать это сообщение никак ?
1 дек 11, 17:07    [11691122]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
При этом приложение делает вот такую блокировку перед вставкой:
set nocount on declare @i integer select @i=1 from _1SCRDOC(TABLOCK HOLDLOCK) where 0=1

Возможно проблема в ней?
1 дек 11, 17:08    [11691129]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Glory
А прочитать это сообщение никак ?
"Подключение занято до получения результатов для другого hstmt", последнее что делает приложение по профайлеру:
exec sp_cursor 180150021,1,1,N'',@USRSCNT=0,@NETCHGCN=1
exec sp_cursorclose 180150021
exec sp_cursorunprepare 1073741825
1 дек 11, 17:10    [11691155]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Вот код до вылета по профайлеру:
set implicit_transactions on
set nocount on declare @i integer select @i=1 from _1SCRDOC(TABLOCK HOLDLOCK) where 0=1
declare @p1 int
set @p1=1073741830
declare @p2 int
set @p2=180150019
declare @p5 int
set @p5=2
declare @p6 int
set @p6=1
declare @p7 int
set @p7=-1
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(18),@P2 varchar(11)',N'Select * from _1SJOURN WITH (NOLOCK) where DNPREFIX=@P1 and DOCNO=@P2 order by DNPREFIX, DOCNO, ROW_ID',@p5 output,@p6 output,@p7 output,'      21982011    ','ПШ-0005242 '
select @p1, @p2, @p5, @p6, @p7
exec sp_cursorfetch 180150019,1,0,1
declare @p2 char(9)
set @p2='  UOLG   '
select @id=MAXID from _1SUIDCTL(NOLOCK) where TYPEID=@p2 if @id is null select @id='         '
select @p2
declare @p1 varchar(9)
set @p1='  UOLG   '
select @p1=MAX(IDDOC) from _1SJOURN(NOLOCK) if @id is null select @p1='         '
select @p1
exec sp_executesql N'Insert into _1SJOURN values( @P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8,@P9,@P10,@P11,@P12,@P13,@P14,@P15,@P16,@P17,@P18,@P19,@P20,@P21,@P22,@P23,@P24,@P25,@P26,@P27,@P28,@P29,@P30,@P31,@P32,@P33)',N'@P1 int,@P2 varchar(9),@P3 int,@P4 smallint,@P5 varchar(23),@P6 varchar(18),@P7 varchar(11),@P8 tinyint,@P9 bit,@P10 int,@P11 int,@P12 bit,@P13 bit,@P14 bit,@P15 bit,@P16 bit,@P17 bit,@P18 bit,@P19 bit,@P20 bit,@P21 bit,@P22 bit,@P23 varchar(9),@P24 varchar(9),@P25 varchar(9),@P26 numeric(1,0),@P27 varchar(1),@P28 varchar(9),@P29 varchar(9),@P30 tinyint,@P31 tinyint,@P32 varchar(13),@P33 varchar(23)',2452,'  UOLH   ',2198,0,'201112017ZGXQ8  UOLH   ','      21982011    ','ПШ-0005242',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'     0   ','    4R   ','    13ZG ',0,' ','     0   ','     0   ',0,0,'             ','                       '
IF @@TRANCOUNT > 0 ROLLBACK TRAN
IF @@TRANCOUNT > 0 ROLLBACK TRAN
set implicit_transactions off 
set implicit_transactions off	
exec sp_executesql N'Delete from _1SDNLOCK where  DNPREFIX=@P1 and DOCNO=@P2',N'@P1 varchar(28),@P2 varchar(24)','      21982011    ','ПШ-0005242 '
exec sp_cursorclose 180150015
exec sp_cursorunprepare 1073741829
declare @p2 int
set @p2=180150021
declare @p3 int
set @p3=2
declare @p4 int
set @p4=2
declare @p5 int
set @p5=-1
exec sp_cursorexecute 1073741825,@p2 output,@p3 output,@p4 output,@p5 output
select @p2, @p3, @p4, @p5
exec sp_cursorfetch 180150021,2,0,1
exec sp_cursor 180150021,1,1,N'',@USRSCNT=0,@NETCHGCN=1
exec sp_cursorclose 180150021
exec sp_cursorunprepare 1073741825

1 дек 11, 17:19    [11691228]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Вот код до вылета по профайлеру:

И где же тут серверная ошибка по Профайлеру ?
1 дек 11, 17:26    [11691273]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Ошибки SQL нет, но приложение говорит об ошибке.
1 дек 11, 17:28    [11691294]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Ошибки SQL нет, но приложение говорит об ошибке.

Значит наверное нужно приложение исправлять ?
Зачем оно пытается, не дождавшись завершения одной команды, в том же подключении запустить новую команду ?
1 дек 11, 17:31    [11691318]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2005 триггер на Insert с обновлением некоторых колонок вставляемых данных?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Вопрос решился добавлением set nocount on:
CREATE TRIGGER [dbo].[_1SJOURN_OnInsert] ON [dbo].[_1SJOURN]
AFTER INSERT, UPDATE
AS
BEGIN
	set nocount on
	UPDATE
		_1SJOURN
	SET
		IDDOC13 = CASE WHEN IDDOCDEF < 46656 THEN ' '+RTRIM(dbo.Convert10To36(IDDOCDEF)) ELSE RTRIM(dbo.Convert10To36(IDDOCDEF)) END + IDDOC,
		IDDOC23 = 'O1'+CASE WHEN IDDOCDEF < 46656 THEN ' '+RTRIM(dbo.Convert10To36(IDDOCDEF)) ELSE RTRIM(dbo.Convert10To36(IDDOCDEF)) END + IDDOC + '	  '
	WHERE IDDOC IN (SELECT Ins.IDDOC FROM Inserted AS Ins)
END
1 дек 11, 18:43    [11691891]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить