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

Откуда:
Сообщений: 5
В моей задаче надо создать триггер, который обрабатывал не только одиночные вставки но и массовые и если с одиночными всё в порядке, то с несколькими вставками всё плохо.
Как заставить триггер разбирать каждый INSERT в одном пакете


ALTER TRIGGER Employees.tgEx9 ON Employees.Employee
AFTER INSERT
AS
 UPDATE Employees.Employee
 SET Employees.Employee.job_lvl =  min_lvl FROM Employees.Jobs
 WHERE Employee.job_lvl <(SELECT j.min_lvl 
		          FROM Employees.Jobs j INNER JOIN inserted i
		          ON j.job_id=i.job_id )	 
GO


Моё задание и таблицы:
Создать триггер на событие INSERT в таблице Employee,
который меняет значение job_lvl на значение min_lvl,
если введенное job_lvl меньше, чем min_lvl.

CREATE TABLE Employees.Jobs(
job_id smallint NOT NULL
,job_desc varchar (50) NOT NULL
,min_lvl tinyint NULL
,max_lvl tinyint NULL
CONSTRAINT PK_job PRIMARY KEY ( job_id ASC ) 

);

CREATE TABLE Employees.Employee (
emp_id int NOT NULL 
,fname varchar (20) NOT NULL
,lname varchar (30) NOT NULL
,job_id smallint NOT NULL
,job_lvl tinyint NULL
,hire_date datetime NOT NULL
CONSTRAINT PK_emp PRIMARY KEY ( emp_id ASC )
CONSTRAINT FK_Employee_job FOREIGN KEY (job_id )    
REFERENCES Employees.Jobs(job_id)
);
10 фев 16, 09:20    [18797425]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vadelic
Как заставить триггер разбирать каждый INSERT в одном пакете

Триггер и так срабытывает один раз на каждую команду.
И каждое срабатывание триггера и есть отдельный пакет.
И это не изменить.

Vadelic
Создать триггер на событие INSERT в таблице Employee,
который меняет значение job_lvl на значение min_lvl,
если введенное job_lvl меньше, чем min_lvl.

UPDATE a
 SET job_lvl =  a.min_lvl 
FROM Employees.Jobs a
INNER JOIN inserted i ON a.job_id=i.job_id 
where  a.job_lvl < i.min_lvl 	 
10 фев 16, 09:29    [18797469]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Vadelic
Member

Откуда:
Сообщений: 5
Я имелл виду вот такое добавление:
INSERT INTO Employees.Employee
VALUES 
(21, 'Pavel', 'Stolyarov', 1,7, '2011-11-1'),--TRIGGER check
(22, 'Ivan', 'Toptygin', 2,3, '2010-10-2'), 
(23, 'Max', 'Maximumov', 3,3, '2009-9-3');   --TRIGGER check
GO


Когда добавляю одну строку, то всё хорошо работает
10 фев 16, 09:39    [18797516]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vadelic
Когда добавляю одну строку, то всё хорошо работает

Еще раз
Триггер срабатывает одни раз на одну команду
И в триггере у вас есть доступ ко всем записям, затронутым этой командой
Простот научитесь работать с наборами данных как с наборами, а не как с отдельными записями
10 фев 16, 09:43    [18797521]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Vadelic
Member

Откуда:
Сообщений: 5
Glory,
Подскажите хоть куда капнуть. Пока у меня получается два варианта
1 Сравнить полностью таблицы, что не подходит
2 Делает первое сравнение и вставляет его результат во все записи
10 фев 16, 09:47    [18797530]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vadelic
Подскажите хоть куда капнуть. Пока у меня получается два варианта
1 Сравнить полностью таблицы, что не подходит
2 Делает первое сравнение и вставляет его результат во все записи

Вы знате, что такое соединение таблиц ?
Вы умеете писать запросы с соединением нескольких таблиц ?
Вы знате, что такое таблицы inserted/deleted ?
Вы все ответы читаете ?
10 фев 16, 09:50    [18797533]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Vadelic
Glory,
Подскажите хоть куда капнуть. Пока у меня получается два варианта
1 Сравнить полностью таблицы, что не подходит
2 Делает первое сравнение и вставляет его результат во все записи
Glory же вам уже всё написал! 18797469
10 фев 16, 09:50    [18797535]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Vadelic
Member

Откуда:
Сообщений: 5
Glory
Vadelic
Подскажите хоть куда капнуть. Пока у меня получается два варианта
1 Сравнить полностью таблицы, что не подходит
2 Делает первое сравнение и вставляет его результат во все записи

Вы знате, что такое соединение таблиц ?
Вы умеете писать запросы с соединением нескольких таблиц ?
Вы знате, что такое таблицы inserted/deleted ?
Вы все ответы читаете ?


Да, знаю, но познакомился со всем этим неделю назад. В одной из книг, которую читал, этот вопрос обходят стороной.
Масштаб задачи понимаю, но не совсем понятно как решать.

пример
UPDATE a
 SET job_lvl =  a.min_lvl 
FROM Employees.Jobs a
INNER JOIN inserted i ON a.job_id=i.job_id 
where  a.job_lvl < i.min_lvl 	 


я немного переписал:
UPDATE Employees.Employee
 SET job_lvl =  a.min_lvl 
FROM Employees.Jobs a
INNER JOIN inserted i ON a.job_id=i.job_id 
where  i.job_lvl < a.min_lvl 


но он меняет все значения, если надо изменить хотя бы только у одной записи
10 фев 16, 09:59    [18797565]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vadelic
я немного переписал:

Т.е. вы не знаете, что такое join
Вы считаете, что достоточно просто добавить имя таблицы в запрос и пускай сервер сам там придумвает, как соединять эту таблицу с остальными ?
10 фев 16, 10:04    [18797586]     Ответить | Цитировать Сообщить модератору
 Re: Обработка триггером группы INSERTов  [new]
Vadelic
Member

Откуда:
Сообщений: 5
Glory
Vadelic
я немного переписал:

Т.е. вы не знаете, что такое join
Вы считаете, что достоточно просто добавить имя таблицы в запрос и пускай сервер сам там придумвает, как соединять эту таблицу с остальными ?


Спасибо за наводку!!
UPDATE Employees.Employee
 SET job_lvl =  a.min_lvl 
FROM inserted i
INNER JOIN Employees.Jobs a
ON a.job_id=i.job_id 
INNER JOIN Employees.Employee e
ON a.job_id=e.job_id
where  i.job_lvl < a.min_lvl 

Вот так всё заработало!
10 фев 16, 10:10    [18797611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить