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

Откуда: РБ
Сообщений: 950
подскажите как лучше задать @id_org_ob, ну и ещё мб что не так
create trigger [SubpMatZ_update]
on [pldo_fin].[subp_mat_zachet]
for update -- на insert такой же
as
begin
--
declare @id_org_ob as int
declare @error varchar(150)
declare @sum_mat_z decimal(10,1)
declare @sum_mat_v decimal(10,1)
--
set @id_org_ob = (select distinct id_org_ob
from inserted)

set @sum_mat_z = (select sum(mat_z)
from pldo_fin.subp_mat_zachet
where id_org_ob = @id_org_ob
group by id_org_ob)

set @sum_mat_v = (select sum(mat_v)
from pldo_fin.subp_mat_vid
where id_org_ob = @id_org_ob
group by id_org_ob)
--
if (isnull(@sum_mat_z, 0) > isnull(@sum_mat_v, 0))
begin
set @error = 'Данные не будут сохранены, т.к. сумма выданных материалов меньше, итого выдано - ' +  cast(isnull(@sum_mat_v, 0) as varchar(15)) + ' итого зачтено - ' + cast(isnull(@sum_mat_z, 0) as varchar(15))
raiserror(@error, 16, 1)
ROLLBACK TRANSACTION
end
--
end;
5 ноя 09, 13:47    [7885780]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
Glory
Member

Откуда:
Сообщений: 104760
set @id_org_ob = (select distinct id_org_ob from inserted) - а если в inserted много разных id_org_ob, то что произойдет ?
5 ноя 09, 13:48    [7885802]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
какой замечательный триггер для таблицы с одной строкой!
5 ноя 09, 13:51    [7885823]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
koJIo6ok
оцените треггер плз
2 балла.
koJIo6ok
ну и ещё мб что не так
Практически всё

Представьте, что есть две таблицы deleted и inserted, заполненные данными (много строк).
Выбросьте переменные из триггера и напишите запрос с использованием этих таблиц.
5 ноя 09, 13:52    [7885835]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Glory
set @id_org_ob = (select distinct id_org_ob from inserted) - а если в inserted много разных id_org_ob, то что произойдет ?

будет горе, но по идее такого не может быть, так?
так заполняется таблица
create proc [pldo_fin].[usp_avans_zachet_subp_get]
	@id int,
	@god smallint
as
begin
set nocount on
select kod_mes, tek_av_z, cel_av_z, indeks
from pldo_fin.subp_avans_zachet
where id_org_ob = @id and god = @god
end;
так обновляется
create proc [pldo_fin].[usp_avans_zachet_subp_get]
	@id int,
	@god smallint
as
begin
set nocount on
select kod_mes, tek_av_z, cel_av_z, indeks
from pldo_fin.subp_avans_zachet
where id_org_ob = @id and god = @god
end;
5 ноя 09, 13:54    [7885856]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
MsDatabaseru,
с чего вы так решили?
5 ноя 09, 13:55    [7885860]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
Glory
Member

Откуда:
Сообщений: 104760
koJIo6ok
Glory
set @id_org_ob = (select distinct id_org_ob from inserted) - а если в inserted много разных id_org_ob, то что произойдет ?

будет горе, но по идее такого не может быть, так?
так заполняется таблица

А если я буду заполнять таблицу не через процедуру ?
Молится, что этого нет, и проверять, что этого нет в действительности - это разные вещи
5 ноя 09, 13:56    [7885870]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
iap
koJIo6ok
оцените треггер плз
2 балла.
koJIo6ok
ну и ещё мб что не так
Практически всё

Представьте, что есть две таблицы deleted и inserted, заполненные данными (много строк).
Выбросьте переменные из триггера и напишите запрос с использованием этих таблиц.

так не получится надо знать сумму выданных материалов что бы сравнить с суммой зачтенных
5 ноя 09, 13:57    [7885873]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
koJIo6ok у меня к вам два предложение 1) Сделать как сказала jap и не изобретать велосипед. 2) god = @god если вы проверяет не номер божества, а года то пишите year…

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
5 ноя 09, 14:03    [7885922]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
собственно единственная причина по которой реализацию целостности данных имеет смысл поместить в триггер - это предотвращение несанкционированных изменений посредством выполнения пользовательских скриптов на модификацию данных.
иначе все проверки лучше поместить в процедуру которая модифицирует данные этой таблицы
5 ноя 09, 14:08    [7885971]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
DENIS_CHEL
koJIo6ok у меня к вам два предложение 1) Сделать как сказала jap и не изобретать велосипед. 2) god = @god если вы проверяет не номер божества, а года то пишите year…

есть две таблицы
1 - материалы выдача 2 - материалы зачтено
задача - сделать невозможным зачет суммы материалов большей чем сумма выданных материалов
это сделать смотря в deleted и inserted таблицы №2 зачет мат нельзя

вот про божество по делу
5 ноя 09, 14:12    [7885994]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
DENIS_CHEL
1) Сделать как сказала japiap
Обижаете!
5 ноя 09, 14:12    [7886000]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
что то в ваших процедурах невидно UPDATE статемента
эти процедуры таки на выборку а каков будет апдейт на базовую таблицу видимо решит клиентское приложение
5 ноя 09, 14:18    [7886050]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
iap, простите я не специально, хотя меня это и не извеняет(((

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
5 ноя 09, 14:21    [7886082]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
DENIS_CHEL
iap, простите я не специально, хотя меня это и не извеняет(((

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
Да ладно, чего там!
Смайлик-то мой у Вас не отображается что ли?
5 ноя 09, 14:25    [7886118]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
MsDatabaseru
что то в ваших процедурах невидно UPDATE статемента
эти процедуры таки на выборку а каков будет апдейт на базовую таблицу видимо решит клиентское приложение

прошу прощения скинул нето :(
create proc [pldo_fin].[usp_mat_zachet_subp_get]
	@id_org_ob	int,
	@god		smallint
as
begin
set nocount on
select kod_mes, mat_z
from pldo_fin.subp_mat_zachet
where id_org_ob = @id_org_ob and god = @god
end;

create proc [pldo_fin].[usp_mat_zachet_subp_upd]
	@id_org_ob	int,
	@god		smallint,
	@kod_mes	tinyint,
	@mat_z		decimal(10,1),	
	@kod_polz	smallint
as
begin
set nocount on
update pldo_fin.subp_mat_zachet
set mat_z = @mat_z, upd_user = @kod_polz, upd_date = getdate()
where id_org_ob = @id_org_ob and god = @god and kod_mes = @kod_mes
end;
5 ноя 09, 14:28    [7886144]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
MsDatabaseru
собственно единственная причина по которой реализацию целостности данных имеет смысл поместить в триггер - это предотвращение несанкционированных изменений посредством выполнения пользовательских скриптов на модификацию данных.
иначе все проверки лучше поместить в процедуру которая модифицирует данные этой таблицы

очень интересно, спасибо большое
5 ноя 09, 14:29    [7886156]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
iap
DENIS_CHEL
iap, простите я не специально, хотя меня это и не извеняет(((

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
Да ладно, чего там!
Смайлик-то мой у Вас не отображается что ли?


На работе выключил картинки… Все равно извените)))

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
5 ноя 09, 14:39    [7886236]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
"да не извеняйся не надо - я тебе уже на спину плюнул"
зы без обид, анекдот такой есть
5 ноя 09, 14:45    [7886283]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
MsDatabaseru,
так?
create proc [pldo_fin].[usp_mat_zachet_subp_ins]
	@id_org_ob	int,
	@god		smallint,
	@kod_mes	tinyint,
	@mat_z		decimal(10,1),
	@kod_polz	smallint
as
begin
set nocount on
--
declare @error varchar(150)
declare @sum_mat_z decimal(10,1)
declare @sum_mat_v decimal(10,1)
--
set @sum_mat_z = (select sum(mat_z)
from pldo_fin.subp_mat_zachet
where id_org_ob = @id_org_ob
group by id_org_ob)

set @sum_mat_v = (select sum(mat_v)
from pldo_fin.subp_mat_vid
where id_org_ob = @id_org_ob
group by id_org_ob)
--
if ((isnull(@sum_mat_z, 0) + @mat_z) > isnull(@sum_mat_v, 0))
begin -- error
set @error = 'Данные не будут сохранены, т.к. сумма выданных материалов меньше, итого выдано = ' +  cast(isnull(@sum_mat_v, 0) as varchar(15)) + ' итого зачтено = ' + cast((isnull(@sum_mat_z, 0) + @mat_z) as varchar(15))
raiserror(@error, 16, 1)
end
else 
begin -- ok
insert into pldo_fin.subp_mat_zachet(id_org_ob, god, kod_mes, mat_z, upd_user)
values(@id_org_ob, @god, @kod_mes, @mat_z, @kod_polz)
end
--
end;
ну да так приятнее чем в триггере, особенно на таблицах где есть столбец с identity дырочки эт конечно хорошо но жалко как то
5 ноя 09, 14:55    [7886377]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
помогите с условием на выборку -
where id_org_ob = @id_org_ob and god <> @god and kod_mes <> @kod_mes
как написать условие что бы
выбрать все записи где id_org_ob = @id_org_ob кроме той где год = @god и код_мес = @kod_mes ?
5 ноя 09, 16:18    [7887097]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
Supra93
Member

Откуда:
Сообщений: 8174
koJIo6ok
помогите с условием на выборку -
where id_org_ob = @id_org_ob and god <> @god and kod_mes <> @kod_mes
как написать условие что бы
выбрать все записи где id_org_ob = @id_org_ob кроме той где год = @god и код_мес = @kod_mes ?

<>
5 ноя 09, 16:20    [7887122]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
koJIo6ok
помогите с условием на выборку -
where id_org_ob = @id_org_ob and god <> @god and kod_mes <> @kod_mes
как написать условие что бы
выбрать все записи где id_org_ob = @id_org_ob кроме той где год = @god и код_мес = @kod_mes ?

кроме той где = and not (...)

where id_org_ob = @id_org_ob and not ( год = @god and код_мес = @kod_mes )
5 ноя 09, 16:23    [7887149]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Надо ещё, наверно, отслеживать и изменение NULL на не-NULL и не-NULL на NULL?
5 ноя 09, 16:26    [7887178]     Ответить | Цитировать Сообщить модератору
 Re: оцените треггер плз  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
MsDatabaseru, вот спасибо теперь и на обновление вышло
create proc [pldo_fin].[usp_mat_zachet_subp_upd]
	@id_org_ob	int,
	@god		smallint,
	@kod_mes	tinyint,
	@mat_z		decimal(10,1),	
	@kod_polz	smallint
as
begin
set nocount on
--
declare @error varchar(150)
declare @sum_mat_z decimal(10,1)
declare @sum_mat_v decimal(10,1)
--
set @sum_mat_z = (select sum(mat_z)
from pldo_fin.subp_mat_zachet
where id_org_ob = @id_org_ob and not (god = @god and kod_mes = @kod_mes)
group by id_org_ob)

set @sum_mat_v = (select sum(mat_v)
from pldo_fin.subp_mat_vid
where id_org_ob = @id_org_ob
group by id_org_ob)
--
if ((isnull(@sum_mat_z, 0) + @mat_z) > isnull(@sum_mat_v, 0))
begin -- error
set @error = 'Данные не будут обновлены, т.к. сумма выданных материалов меньше, итого выдано = ' +  cast(isnull(@sum_mat_v, 0) as varchar(15)) + ' итого зачтено = ' + cast((isnull(@sum_mat_z, 0) + @mat_z) as varchar(15))
raiserror(@error, 16, 1)
end
else 
begin -- ok
update pldo_fin.subp_mat_zachet
set mat_z = @mat_z, upd_user = @kod_polz, upd_date = getdate()
where id_org_ob = @id_org_ob and god = @god and kod_mes = @kod_mes
end
--
end;
5 ноя 09, 16:34    [7887302]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить