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

Откуда:
Сообщений: 104
Суть проблемы такая есть вьюха, которая объединяет две таблицы.
На вьюхе висит триггер, который определяет в какую таблицу вставлять, новую строку.

Проблема такая, если в батче вставляется две строки и первый инсерт завершается ошибкой Violation PK, то вторая строка не вставляется. Пример ниже.

Почему вторая строка не вставляется при возникновении ошибки?

create table tt1 (id INT, f1 int, CONSTRAINT [PK_tt1] PRIMARY KEY (ID))
go

create table tt2 (id INT, f1 int, CONSTRAINT [PK_tt2] PRIMARY KEY (ID))
go

create view ttn
as
select * from tt1
union all
select * from tt2
go

CREATE TRIGGER [dbo].[T_ttn_check] ON [dbo].[ttn] INSTEAD OF INSERT
AS
SET NOCOUNT ON

print 'T_ttn_check'

declare @RowId int, @f1 int

declare inserted_rows cursor local for select id, f1 from inserted

open inserted_rows fetch next from inserted_rows into @RowId, @f1

while (@@fetch_status=0)
begin
print 'T_Trades_CheckDate id=' + CAST(CAST(@RowId as int) as varchar)
if (@RowId < 100)
begin
insert into tt1 select * from inserted where id=@RowId
end
else begin
insert into tt2 select * from inserted where id=@RowId
end
fetch next from inserted_rows into @RowId, @f1
end
close inserted_rows
deallocate inserted_rows
GO

insert into ttn (id, f1) values (10, 1)
go

insert into ttn (id, f1) values (10, 1)
insert into ttn (id, f1) values (1000, 2)
21 июл 14, 08:01    [16332967]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
artii,
Потому что консистентность данных, и это правильно.

При решения вашей задачи , используйте проверку перед вставкой, есть ли запись с таким PK.
21 июл 14, 08:16    [16332979]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
да и курсор, там не нужен.
21 июл 14, 08:17    [16332981]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
Ken@t
artii,
Потому что консистентность данных, и это правильно.

При решения вашей задачи , используйте проверку перед вставкой, есть ли запись с таким PK.


Это все понятно, почему вторая строка не вставляется?
21 июл 14, 08:27    [16332991]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
artii
почему вторая строка не вставляется?
Потому что при выполнении триггера неявно устанавливается xact_abort в on.
Что, при возникновении ошибки, приводит к откату транзакции и снятию с выполнения пакета - до insert into ttn (id, f1) values (1000, 2) дело просто не доходит.

ЗЫ: триггер просто ужасен...
21 июл 14, 10:00    [16333395]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
artii,

SET XACT_ABORT OFF
insert into ttn (id, f1) values (10, 1)
insert into ttn (id, f1) values (1000, 2) 
21 июл 14, 10:00    [16333397]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
Ken@t
artii,

SET XACT_ABORT OFF
insert into ttn (id, f1) values (10, 1)
insert into ttn (id, f1) values (1000, 2) 


У меня не работает вторая строка не вставляется.
А у вас, вы проверяли?
21 июл 14, 10:04    [16333432]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
artii
У меня не работает вторая строка не вставляется.
Не читатель...
21 июл 14, 10:11    [16333484]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
Может вы как-то развернете свой ответ.
Честно, я кроме сарказма ни че не понял?
21 июл 14, 10:33    [16333642]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
artii
Может вы как-то развернете свой ответ.
Честно, я кроме сарказма ни че не понял?
Что ж тут не понять??
При SET XACT_ABORT ON (в триггере так по умолчанию) откатывается вся транзакция
из-за ошибочной второй строчки - ни одной строчки не вставляется.
При SET XACT_ABORT OFF первая строчка корректная, вставляется.
А вторая - ошибочная - транзакция откатывается для неё, а первая строчка остаётся!
Разве не это написано в BOL?
Там даже пример похожий есть. Про нарушение FK.
21 июл 14, 10:39    [16333684]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
artii,

Вы спросили почему, ответ был дан - 16333395. Так же было сказано что делать - 16332979
Не хотите делать нормально, а желаете поставить костыль? Тогда поставьте в начало триггера set xact_abort off.
21 июл 14, 10:42    [16333707]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
invm,

А блин, сорри, я пропустил ваш ответ, посыпаю голову пеплом

Все сразу решилось,

Большое спасибо
21 июл 14, 11:03    [16333861]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
artii,

Нихрена не решилось - гвнокод остался.
21 июл 14, 11:09    [16333903]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
это в примере этот код - говнокод
в реальной системе все по делу
21 июл 14, 11:35    [16334110]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
Ken@t,

Хорошо, в чем говнокод по-вашему?
Как бы вы переписали?

т.е. вместо курсора написать два инсерта

CREATE TRIGGER [dbo].[T_ttn_check] ON [dbo].[ttn] INSTEAD OF INSERT
AS
SET NOCOUNT ON
SET XACT_ABORT OFF

insert into tt1 select * from inserted where id < @RowId
insert into tt2 select * from inserted where id >=@RowId
GO
21 июл 14, 11:49    [16334191]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
artii
insert into tt1 select * from inserted where id < @RowId
insert into tt2 select * from inserted where id >=@RowId
Это тоже говнокод.
Потому что явно не задано соответствие полей целевой таблицы и таблицы-источника.
*
21 июл 14, 11:52    [16334214]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
artii
Хорошо, в чем говнокод по-вашему?
Курсор, особенно в триггере, - практически всегда говнокод.

Покажите реальный код и вам помогут привести его к нормальному виду.
21 июл 14, 12:00    [16334278]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
iap
Это тоже говнокод.
Потому что явно не задано соответствие полей целевой таблицы и таблицы-источника.
*


И чем это плохо, в чем проблема такого кода?
21 июл 14, 12:02    [16334303]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
artii
И чем это плохо, в чем проблема такого кода?
Гарантируете, что кто-нибудь когда-нибудь не изменит в вашем представлении, например, порядок столбцов?
21 июл 14, 12:06    [16334342]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
artii
iap
Это тоже говнокод.
Потому что явно не задано соответствие полей целевой таблицы и таблицы-источника.
*


И чем это плохо, в чем проблема такого кода?
А как гарантируется даже равенство количества полей трёх таблиц - ttn, tt1, tt2?
Не говоря уже о порядке и типах этих полей?
21 июл 14, 12:06    [16334345]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
artii
Member

Откуда:
Сообщений: 104
iap,

Ну у нас такой подход, скрипты для создание/модификации БД создаются автоматически на базе некоторого текстового описания. Поэтому и вьюха и таблицы создаются в строгом соответствии друг другу.
Потом все скрипты прокатываются на собственные тестовые БД, где вылезает/ не вылезает куча проблем.
После тестирования, скрипты отправляются клиентам. Они конечно могут править руками скрипты, но мы их отучаем от этого.
21 июл 14, 12:24    [16334460]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляются строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
artii
iap,

Ну у нас такой подход, скрипты для создание/модификации БД создаются автоматически на базе некоторого текстового описания. Поэтому и вьюха и таблицы создаются в строгом соответствии друг другу.
Потом все скрипты прокатываются на собственные тестовые БД, где вылезает/ не вылезает куча проблем.
После тестирования, скрипты отправляются клиентам. Они конечно могут править руками скрипты, но мы их отучаем от этого.
Ну, я и говорю - говнокод!
21 июл 14, 12:38    [16334569]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить