Задать вопрос
EgoRusMarch
@EgoRusMarch
C++ Developer

Как узнать триггеру значение поля удаляемой строки?

Такое задание:
Создайте триггер, который автоматически будет увеличивать или уменьшать [КолСотр] в таблице [Отделы] при добавлении или удалении записей в таблице [Сотрудники].


Для наглядности:
576e0f43d6ec451d862870276312d453.png
То есть, если удаляется сотрудник из отдела, то у этого отдела есть код (внешний ключ в таблице Сотрудники). И, согласно этому коду, в таблице Отделы нужно декрементировать (или инкрементировать, если будем добавлять сотрудника) поле КолСотр.

Как это сделать?
  • Вопрос задан
  • 415 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 3
NeiroNx
@NeiroNx
Программист
CREATE TRIGGER sampleTrigger
    ON database1.dbo.[СОТРУДНИКИ]
    FOR DELETE
AS
    UPDATE database1.dbo.[ОТДЕЛЫ]
    SET [КОЛСОТР] -= 1
    WHERE [КОДОТДЕЛА] = (SELECT deleted.[КОДОТДЕЛА] FROM deleted)
GO

Это для примера. Но надо писать для всех случаев в том числе когда удаляемых записей больше одной
https://msdn.microsoft.com/ru-ru/library/ms191300.aspx
Ответ написан
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Но я думал, что триггер вызывается для каждой удаляемой записи, разве нет?

FOR EACH ROW в MS SQL нет (в Oracle есть).
Замена.

Как узнать триггеру значение поля удаляемой строки?

В таблице deleted старое (или удаляемое) значение. В inserted — новое или вставляемое.
Ответ написан
Комментировать
EgoRusMarch
@EgoRusMarch Автор вопроса
C++ Developer
Решил задачу таким образом:
CREATE TRIGGER TriggerTwoDelete
	ON Сотрудники FOR DELETE
	AS BEGIN

		DECLARE @NumDepart AS TINYINT = (SELECT COUNT(*) FROM [Отделы]);
		-- @NumDepart - количество существующих отделов

		DECLARE @CurDepart AS TINYINT = 1;
		-- @CurDepart - текущий отдел

		WHILE @CurDepart <= @NumDepart
		BEGIN
			UPDATE [Отделы]
			SET [КолСотр] -= (SELECT COUNT(deleted.[КодОтдела])
				FROM deleted WHERE [КодОтдела] = @CurDepart)
			FROM [Отделы] WHERE [КодОтдела] = @CurDepart;
			SET @CurDepart = @CurDepart + 1;
		END;

	END;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы