Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Зравствуйте! Вопрос такой: есть табл. Jurnal(Kod int-счетчик ,KodAB-int,KodT-int,Price-float). KodT –вычисляется след образом: если в таблице есть запись которая KodAB и Price(старые записи)= KodAB и Price (вставляемой строкой), то KodT(вставляемая строка)= KodT (старые записи)+1 иначе KodT(вставляемая строка)= 1. В табл. может быть несколько таких совпадение, нужно брать тот который записан в табл. последним. Сделал след образом, но оказывается не правильно создал логику. И вообще в табл. Inserted & Deleted имеют по одной записи или их может быть несколько?
+
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER trigger [tInsert] on [dbo].[Jurnal]
for insert
as
begin
 	declare @a int,@b int
	select @b=(select top 1 Kod from inserted)
	select @a=(select top 1 isnull(j.kodT,0) from Jurnal j join  inserted i on (j.KodAB=i.KodAB and j.Price=i.Price )order by j.kodt desc)
	if @a<>0
		begin
			update Jurnal
			set KodT = @a+1 where Kod=@b
		end
	else
		begin
			update Jurnal
			set KodT = 1 where Kod=@b
		end 
end

go

ALTER trigger [tUpdate] on [dbo].[Jurnal]
for update
as
if update(KodAB)or update(Price)
begin
	declare @KodAB int,@Price int
	set @KodAB=(select Kod from deleted)
	set @Price=(select Price from deleted)
	declare @KodAB1 int,@Price1 int
	set @KodAB1=(select Kod from inserted)
	set @Price1=(select Price from inserted)

	if (@KodAB=@KodAB1 and @Price=@Price1 ) 
	goto label1
 		declare @a int,@b int
		set @b=(select top 1 Kod from deleted)
		set @a=(select top 1 a from (select isnull(j.KodT,0)a,j.Kod from Jurnal j  
				left join inserted i on j.KodAB=i.KodAB and j.Price=i.Price join deleted d on j.Kod<>d.Kod)f order by f.Kod desc )
		if @a<>0 
			begin
				update Jurnal
				set KodT = @a+1 where Kod=@b
			end
		else
			begin
				update Jurnal
				set KodT = 1 where Kod=@b
			end 
	label1:
end
2 дек 11, 14:51    [11696548]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Таблицы inserted и deleted могут содержать от 0 до бесконечности записей.
2 дек 11, 15:10    [11696721]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Гавриленко Сергей Алексеевич
Таблицы inserted и deleted могут содержать от 0 до бесконечности записей.
а живут они долго?
2 дек 11, 15:13    [11696741]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ZVER-10
Гавриленко Сергей Алексеевич
Таблицы inserted и deleted могут содержать от 0 до бесконечности записей.
а живут они долго?
А какая разница? Их все равно только из триггера видно.
2 дек 11, 15:15    [11696771]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ну примерно то я должен иметь представление, когда какие записи там существуют чтоб в триггере вложить правильную логику? а на счет триггера что можете посоветовать?
Гавриленко Сергей Алексеевич
ZVER-10
пропущено...
а живут они долго?
А какая разница? Их все равно только из триггера видно.
2 дек 11, 15:18    [11696804]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ZVER-10
ну примерно то я должен иметь представление, когда какие записи там существуют чтоб в триггере вложить правильную логику?
Так в документации же написано, какие записи там существуют.
2 дек 11, 15:19    [11696815]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ну например, если я вставляю в поле1 значение 5 то в инсертед будет эта запись. а если через пять мин. добавлю еще одну строку поле1 значение 6 то в инсертед будет предыдущая запись т.е. поле1 значение 5?
Гавриленко Сергей Алексеевич
ZVER-10
ну примерно то я должен иметь представление, когда какие записи там существуют чтоб в триггере вложить правильную логику?
Так в документации же написано, какие записи там существуют.
2 дек 11, 15:25    [11696882]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
а вообще по поводу моего триггера направьте меня на верный путь
2 дек 11, 15:26    [11696894]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZVER-10
ну например, если я вставляю в поле1 значение 5 то в инсертед будет эта запись

А если вы добавите сразу 100 записей, то что будет в inserted ?
2 дек 11, 15:27    [11696902]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ну продскажите вы) я же как раз про это и спросил
Glory
ZVER-10
ну например, если я вставляю в поле1 значение 5 то в инсертед будет эта запись

А если вы добавите сразу 100 записей, то что будет в inserted ?
2 дек 11, 15:29    [11696924]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZVER-10
ну продскажите вы) я же как раз про это и спросил

Сюрприз! В inserted тоже будет 100 записей
2 дек 11, 15:31    [11696954]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
спс) т.е. а на посмотрите мой триггер, если не трудно и подскажите как и что исправить, плиз
Glory
ZVER-10
ну продскажите вы) я же как раз про это и спросил

Сюрприз! В inserted тоже будет 100 записей
2 дек 11, 15:34    [11696996]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
народ, по поводу создание триггера подскажите что нибудь
2 дек 11, 15:47    [11697149]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
хотя помогите с триггером на ИНСЕРТ. а апдейт сам потом еще покопаюсь
2 дек 11, 15:49    [11697184]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
select @b=(select top 1 Kod from inserted)

1. Зачем там top 1?
2. Предусмотрели такую ситуацию, если запрос вернет 0 строк и в @b будет null?
2 дек 11, 16:10    [11697417]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ну а как я могу определить значение Kod т.е. ид-вставляемой строки?не пришло больше ничего в голове или можно @b=(select max(Kod) from inserted)?
dymka
select @b=(select top 1 Kod from inserted)

1. Зачем там top 1?
2. Предусмотрели такую ситуацию, если запрос вернет 0 строк и в @b будет null?
2 дек 11, 16:16    [11697456]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
если да, что еще неправильно?ZVER-10,
2 дек 11, 16:17    [11697463]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZVER-10
ну а как я могу определить значение Kod т.е. ид-вставляемой строки?

Так вы что собрались этот самый ид генерировать внутри триггера что ли ?
2 дек 11, 16:19    [11697489]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
	if @a<>0
		begin
			update Jurnal
			set KodT = @a+1 where Kod=@b
		end
	else
		begin
			update Jurnal
			set KodT = 1 where Kod=@b
		end 


Очень вдумчиво смотрим этот код... и видим, что в любом случае запрос будет одинаковый. За исключением, конечно, если @a is null. Т.е. следующий код равносилен предыдущему.

update Jurnal
set KodT = isnull(@a, 0)+1 where Kod=@b


По поводу top 1. Таблица (не строка!) inserted может содержать 0, 1 или несколько записей. Поэтому подход с вычислением значением конкретного поля неприменим. Триггер срабатывает не на каждую запись, а на весь statement.
Поэтому все операции в триггере должны быть использованы с учетом этого.
2 дек 11, 16:21    [11697515]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
ZVER-10,

Может у меня к концу недели мозг замылился, но я в вашу постановку задачи не въехал

Понятно одно: если вставляется или изменяется <> 1 строки, ваши триггеры будут работать некорректно.
Именно на это вам все и намекают.

Напишите сначала SELECT, вычисляющий нужные значения для какого-либо множества строк вашей таблицы. Отладьте его в студии.
Напишите на его основе UPDATE, который запишет эти вычисленные значения в столбец. Отладьте его.

Теперь можно писать триггер, имея ввиду что,
множество вставляемых, изменяемых или удаляемых текущей операцией строк (в том числе и пустое), как раз и хранится в таблицах inserted и(или) deleted.
Новые версии - в inserted, старые - в deleted.
2 дек 11, 16:22    [11697527]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
И еще не понятно - строка должна вставляться в любом случае?
Или если есть совпадение, то просто должна проапдейтится другая какая-то строка?
2 дек 11, 16:26    [11697577]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
нет, ид- вставляемой строки я не ставля но должен же знать чтоб написать-where Kod=@b Glory,
2 дек 11, 17:48    [11698133]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ага,в любом случае. т.е. есть совпадение по кодАВ и прайс то кодТ(вставляемой строки)=кодТ(старой. если таких строк несколько то надо брать тот котой последный был добавлен в табл. т.е. тот у которой Код-больше всех)+1 иначе кодТ(вставляемой строки)=1
dymka
И еще не понятно - строка должна вставляться в любом случае?
Или если есть совпадение, то просто должна проапдейтится другая какая-то строка?
2 дек 11, 17:55    [11698167]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
ну еще ночью ппопробую если что -завтра напишу )
2 дек 11, 17:57    [11698180]     Ответить | Цитировать Сообщить модератору
 Re: триггер (вычис. столб.)  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
сделал след образом:
+
ALTER trigger [tInsert] on [dbo].[Jurnal]
for insert
as
begin
 	declare @a int,@b int
	select @b=(select max(Kod) from jurnal)
	select @a=(select top 1 isnull(j.kodT,0) from Jurnal j join  inserted i on (j.KodAB=i.KodAB and j.Price=i.Price ) where i.kod=@b)
	update Jurnal
	set KodT = isnull(@a, 0)+1 where Kod=@b 
end
но не срабатывает если вставляю больше 2-строк. ну наверно из-за того что триггер срабатывает не на каждую строку отдельно. куда нырять, как быть? туплю конкретно
3 дек 11, 11:32    [11700415]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить