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

Откуда:
Сообщений: 26
Здравствуйте!
Создала триггер, который копирует данные, внесенные ранее данные и вносит их ояпть в ту же таблицу, но с другими ИД.
Волнует генерация ИД. Посмотрите, пожалуйста, правильно ли осуществлен механизм генерации ИД.
Set nocount on
begin

declare @data22_id int
declare @pat_id int
declare @mot_id int
declare @dataid1 int
declare @dataid2 int
declare @m_id int
declare @tip_diagnosa1 int
declare @tip_diagnosa2 int		

set @pat_id=(select patients_id from INSERTED)
set @mot_id=(select motconsu_id from INSERTED)

/* set @dataid1=(select IDENT_CURRENT('data_diagnosis'))+1
set @dataid2=@dataid1+1 */ 

set @m_id=(select max(d.motconsu_id) from DATA_DIAGNOSIS d
           join inserted as i
           on d.patients_id=i.patients_id
           join motconsu as m
           on m.patients_id=i.patients_id          
           where m.models_id=326)
set @tip_diagnosa1=(select tip_diagnoza from DATA_DIAGNOSIS
where motconsu_id=@m_id and n_line=1) 
set @tip_diagnosa2=(select tip_diagnoza from DATA_DIAGNOSIS
where motconsu_id=@m_id and n_line=2)   
EXEC UP_GET_ID @KEYNAME='DATA_DIAGNOSIS', @ID = @dataid1 OUTPUT, @SHIFT = 1 

set @dataid2=@dataid1+1

if EXISTS
(select * from motconsu m
join inserted as i
on m.patients_id=i.patients_id
where i.models_id=326)
/*   AND
exists (select * from data_diagnosis d
join inserted as i
on d.patients_id=i.patients_id) */
begin
 
 insert into DATA_DIAGNOSIS (data22_id, patients_id, motconsu_id, n_line, tip_diagnoza)
 values (@dataid1, @pat_id, @mot_id, 1, @tip_diagnosa1)

 if EXISTS
 (select * from DATA_DIAGNOSIS d
 join inserted as i
 on d.patients_id=i.patients_id
 where d.N_LINE=2
 and d.MOTCONSU_ID=@m_id)
 begin 
 insert into DATA_DIAGNOSIS (data22_id, patients_id, motconsu_id, n_line, tip_diagnoza)
 values (@dataid2, @pat_id, @mot_id, 2, @tip_diagnosa2)
 end


 END
 END
14 ноя 13, 11:15    [15126437]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
al.yugay
Member

Откуда:
Сообщений: 26
СУБД Microsoft SQL Server 2008
14 ноя 13, 11:15    [15126440]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
Glory
Member

Откуда:
Сообщений: 104751
Этот триггер не может обработать "вставку нескольких записей "
Потому что он обрабатывает только одну запись
14 ноя 13, 11:19    [15126463]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
al.yugay
Волнует генерация ИД. Посмотрите, пожалуйста, правильно ли осуществлен механизм генерации ИД.

Вот это, что ли, генерация ИД?
set @dataid2=@dataid1+1

Это неправильная генерация, она не будет работать в многопользовательской среде.
14 ноя 13, 11:43    [15126688]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
al.yugay
Member

Откуда:
Сообщений: 26
А как будет работать?
Так будет? EXEC up_get_id 'DATA_DIAGNOSIS', 1, @dataid OUTPUT и в курсор выполнение процедуры
CREATE  procedure up_get_id(@KeyName varchar(30),@Shift integer,@ID integer output)
as
begin
  declare @numrows integer
  begin tran
  select @numrows=count(*) from ID_VALUES where KEY_NAME=@KeyName
  if @@ERROR<>0 goto L_ERROR
  if @numrows=0 insert into ID_VALUES values(@KeyName,0)
  if @@ERROR<>0 goto L_ERROR
  update ID_VALUES set LAST_VALUE=COALESCE(LAST_VALUE,0)+@Shift where Key_NAME=@KeyName
  select @ID=LAST_VALUE-@Shift+1 from ID_VALUES where KEY_NAME=@KeyName
  commit tran
  return 0
  L_ERROR: if @@TRANCOUNT<>0 rollback tran
  raiserror 50001 'E001-Error in sp_get_id.'
end
18 ноя 13, 09:15    [15146193]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
Jaffar
Member

Откуда:
Сообщений: 633
al.yugay,

не изобретайте велосипед - пользуйтесь IDENTITY.

типа так:
create table tABLE_1(
ID numeric(16) identity(1, 1) primary key,
.....)
18 ноя 13, 10:40    [15146542]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
al.yugay
Member

Откуда:
Сообщений: 26
Jaffar,
дело в том, что вставка идет в уже созданную таблицу.
19 ноя 13, 07:23    [15152115]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
al.yugay
Jaffar,
дело в том, что вставка идет в уже созданную таблицу.


alter table
19 ноя 13, 09:34    [15152421]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на вставку нескольких записей  [new]
al.yugay
Member

Откуда:
Сообщений: 26
StarikNavy, разработчики крайне не рекомендуют....
20 ноя 13, 11:54    [15160203]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить