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

Откуда: Украина, Донецк
Сообщений: 61
У меня есть триггер который добавляет записи из функции
USE [Аэропорт]
GO
/****** Object:  Trigger [dbo].[Add_route]    Script Date: 12/18/2012 08:37:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[Add_route] ON [Аэропорт].[dbo].[тРасписания]
AFTER INSERT, UPDATE
AS
BEGIN
INSERT INTO dbo.тРейсы (код_расписания, Время_вылета_факт, Время_прибытия_факт)
SELECT dbo.DateList.kod, dbo.DateList.dt_in, dbo.DateList.dt_out FROM dbo.тРасписания r
	CROSS APPLY  dbo.DateList(r.Период_с, r.Период_по, r.Код_расписания, r.Время_вылета_план, r.Время_прибытия_план)
END


Проблема в том что он добавляет все записи из функции каждый раз когда я добавляю/изменяю запись. Подскажите пожалуйста, как можно исправить эту проблему?
18 дек 12, 10:40    [13647269]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Прошу прощения. Вопрос не корректен. Мне нужно чтобы он добавлял только ту запись, которая добавилась в таблицу или изменилась (при этом желательно изменять её в результирующей таблице, если это возможно)
18 дек 12, 10:42    [13647284]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
Гость333
Member

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

Если у вас версия сервера 2008 и выше, то можно использовать MERGE
18 дек 12, 10:47    [13647310]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Гость333, Спасибо. Сейчас разберусь с синтаксисом
18 дек 12, 10:56    [13647347]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
чукча - не читатель!
Guest
читайте про триггеры, особенно внимательно то место, где описаны псевдотаблицы inserted и deleted
18 дек 12, 11:38    [13647628]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2565
One_question
Прошу прощения. Вопрос не корректен. Мне нужно чтобы он добавлял только ту запись, которая добавилась в таблицу или изменилась (при этом желательно изменять её в результирующей таблице, если это возможно)
В триггере может быть более одной записи в таблицах inserted и deleted (кстати, Вы о них что-нибудь знаете?), о чем как бы и намекает "чукча - не читатель!"...
18 дек 12, 11:47    [13647705]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
Я сейчас и "пытаюсь с ними работать".. начала читать про MERGE
но не могу понять как использовать

ALTER TRIGGER [dbo].[Add_route] ON [Аэропорт].[dbo].[тРасписания]
AFTER INSERT, UPDATE
/*AS
BEGIN
INSERT INTO dbo.тРейсы (код_расписания, Время_вылета_факт, Время_прибытия_факт)
SELECT dbo.DateList.kod, dbo.DateList.dt_in, dbo.DateList.dt_out FROM dbo.тРасписания r
	CROSS APPLY  dbo.DateList(r.Период_с, r.Период_по, r.Код_расписания, r.Время_вылета_план, r.Время_прибытия_план)
END
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
    AS 
	BEGIN
    SET NOCOUNT ON;
MERGE dbo.тРейсы rou
using (select код_расписания, Время_вылета_факт, Время_прибытия_факт from inserted) src
ON  rou.код_расписания = src.код_расписания
WHEN  NOT MATCHED THEN INSERT INTO dbo.тРейсы (код_расписания, Время_вылета_факт, Время_прибытия_факт)
SELECT dbo.DateList.kod, dbo.DateList.dt_in, dbo.DateList.dt_out FROM dbo.тРасписания r
	CROSS APPLY  dbo.DateList(r.Период_с, r.Период_по, r.Код_расписания, r.Время_вылета_план, r.Время_прибытия_план)
WHEN MATCHED UPDATE SET rou.Время_вылета_факт = src.Время_вылета_факт

END;
GO

Извините, да. Я плохо шарю в SQL Server, сейчас вставляю данные по примеру.. но моей логики недостаточно чтобы представить как оно должно выглядеть
18 дек 12, 12:50    [13648094]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
чукча -читатель!
Guest
чета типа этого...

MERGE dbo.тРейсы rou
using (select dl.kod, dl.dt_in, dl.dt_out, r.Время_вылета_факт , r.код_расписания from inserted r
CROSS APPLY  dbo.DateList(r.Период_с, r.Период_по, r.Код_расписания, r.Время_вылета_план, r.Время_прибытия_план) dl
) src
ON  rou.код_расписания = src.код_расписания
WHEN  NOT MATCHED THEN INSERT (код_расписания, Время_вылета_факт, Время_прибытия_факт)
values (src.kod, src.dt_in, src.DateList.dt_out)
	
WHEN MATCHED UPDATE SET rou.Время_вылета_факт = src.Время_вылета_факт

END
18 дек 12, 13:58    [13648582]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
чукча -читатель!,
В этом случае выбивает ошибку
Сообщение 156, уровень 15, состояние 1, процедура Add_route, строка 14
Неправильный синтаксис около ключевого слова "UPDATE".


И ругается еще на r.Время_вылета_факт - неверный синтаксис
rou.Время_вылета_факт = src.Время_вылета_факт - не удалось выполнить привязку составного идентификатора
и на неправильный синтаксис у UPDATE и SET
18 дек 12, 20:40    [13650919]     Ответить | Цитировать Сообщить модератору
 Re: Исключение одинаковых записей при добавлении из триггера  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
чукча -читатель!, всё! Разобралась, работает
18 дек 12, 21:55    [13651148]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить