Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > trigger на insert


Автор: Satana 15.4.2005, 08:00
Люди ну помогите кто чем может. У меня есть таблица в которой есть уникальное поле (номер пластины) обычно его генерируют отдельно, но мне нужно если я вставляю в это поле к примеру 666 то вместо этого подставить другое значение. но чото не получается я делаю так:
Код

CREATE TRIGGER plates_without_sn ON izmerenia
FOR INSERT
AS
declare @zakaz varchar(20)
declare @sn varchar(20)
declare @val float
declare @data datetime
declare @snn varchar(20)
select @sn=ser_nomer_plast, @zakaz=id_zakaz from inserted;
if @sn='666'
begin
set @data=getdate();
set @val=convert(float, @data)
set @val=@val*1000000000;
set @snn=convert(varchar(20),@val);
    update izmerenia set ser_nomer_plast=@snn where ser_nomer_plast='666' and id_zakaz=@zakaz;
end


так не получается при вставке ругается что 666 уже есть в таблице smile. А как по другому чото не могу представить smile

Автор: Akina 15.4.2005, 08:41
вместо
Код

update izmerenia set ser_nomer_plast=@snn where ser_nomer_plast='666' and id_zakaz=@zakaz;

сделай просто
1) insert into izmerenia (ser_nomer_plast, id_zakaz) values (@snn, @zakaz)
2) откажись от вставки в триггере
В результате - вставка не пройдет, но будет выполнен второй запрос на вставку - с теми же данными, но новым серийным номером. А т.к. новый серийный номер не равен 666, то триггер при псевдорекурсивном вызове его пропустит без изменений, и запись ляжет в базу.

Автор: Satana 15.4.2005, 08:45
Akina А как отказаться от вставки в самом триггере? можно примерчик пожалста smile

ЗЫ сейчас вот попробовал как Вы посоветовали но чтото все равно та же ошибка, буду копать на отмену вставки smile

Автор: Akina 15.4.2005, 11:10
м-м-м... что-то около вот так:
Код

CREATE TRIGGER plates_without_sn ON izmerenia
FOR INSERT
AS
declare @zakaz varchar(20)
declare @sn varchar(20)
declare @val float
declare @data datetime
declare @snn varchar(20)
select @sn=ser_nomer_plast, @zakaz=id_zakaz from inserted;
if @sn='666'
begin
set @data=getdate();
set @val=convert(float, @data)
set @val=@val*1000000000;
set @snn=convert(varchar(20),@val);
ROLLBACK TRANSACTION;
insert into izmerenia (ser_nomer_plast, id_zakaz) values (@snn, @zakaz);
end

Автор: Satana 15.4.2005, 12:03
не получается так, орет на уникальное поле в izmerenia, дело в том что ser_nomer_plast есть уникальное поле и повторений не допускает.. может попробовать after insertom как нить?

Автор: Akina 15.4.2005, 13:52
Цитата(Satana @ 15.4.2005, 13:03)
дело в том что ser_nomer_plast есть уникальное поле и повторений не допускает.

Тогда используй триггер не FOR INSERT, а INSTEAD OF INSERT.

Автор: Satana 15.4.2005, 14:47
Akina Я вышел не много по другому, и ошибка была изза невозможности конфертировать дату в формате флоат в стринг. Я просто пишу дату с точностью до миллисекунд в базу и все прекрасно ботает. Но все равно спасибо за примеры.

ЗЫ вот что получилось у меня если вдруг кому потребуется:
Код

CREATE TRIGGER plates_without_sn ON izmerenia
FOR INSERT
AS
declare @zakaz varchar(20)
declare @sn varchar(20)
declare @val float
declare @data datetime
declare @snn varchar(20)
select @sn=ser_nomer_plast, @zakaz=id_zakaz from inserted;
set @data=getdate();
--set @val=convert(float, @data)
set @snn=convert(varchar(20),@data,131);
print @snn;
if @sn='00012345'
begin
ROLLBACK TRANSACTION;
end
insert into izmerenia (ser_nomer_plast, id_zakaz) values (@snn, @zakaz);



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)