powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нормально ли иметь такие тригеры ?
3 сообщений из 3, страница 1 из 1
Нормально ли иметь такие тригеры ?
    #32020107
Фотография XDefender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормально ли иметь такие триггеры ?
CREATE TRIGGER Factures_UPDATE ON [dbo].[Factures]
FOR UPDATE
AS

/* Тут мы запретим изменять данные, если фактура зарегистрированна */
/* Т.е. когда в предыдущее состояние поля Registred и текущее равны*/
IF EXISTS (SELECT TOP 1 ID FROM INSERTED I WHERE REGISTRED=1 AND EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND Registred=1))
BEGIN
RAISERROR('Нельязя модифицировать данные зарегистрированной фактуры',11,1)
ROLLBACK TRANSACTION
GOTO EX
END

/* Ели хотят зарегестрировать фактуру и данные неполные. тогда мы рапортуем об этом ошибкой */
IF EXISTS (SELECT TOP 1 ID FROM INSERTED I WHERE (REGISTRED=1) AND ((Destinator IS NULL) OR (Number IS NULL) OR (NumberTVA IS NULL) ) )
BEGIN
RAISERROR('Неполные данные. Зарегестрировать фактуру нет возможности',11,1)
ROLLBACK TRANSACTION
GOTO EX
END





/* Если фактуру регистрируем и она TMP тогда она просто удаляется */
DELETE FROM FACTURES
WHERE Factures.ID IN (SELECT ID FROM INSERTED WHERE REGISTRED=1 AND TMP=1)


/* Если изменяется фирма, тогда мы меняем город*/

UPDATE Factures
SET LocDescarcare=(select top 1 Town_ID from Firms FI Where FI.ID=I.Destinator)
FROM INSERTED I INNER JOIN Factures F ON F.ID=I.ID AND EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND(D.Destinator<>I.Destinator OR D.Destinator is null))


/*Если изменяется Номер Товара-Транспортной накладной*/

UPDATE FacturesTransport
SET State=0 -- Освобождаем
WHERE ID IN (SELECT Number FROM DELETED D WHERE EXISTS (SELECT TOP 1 ID FROM INSERTED I WHERE I.ID=D.ID AND I.Number<>D.Number))

UPDATE FacturesTransport
SET State=1 -- Занимаем
WHERE ID IN (SELECT Number FROM INSERTED I WHERE EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND D.Number<>I.Number))


/*Если изменяется Номер Накладной НДС */
UPDATE FacturesTVA
SET State=0 -- Освобождаем
WHERE ID IN (SELECT NumberTVA FROM DELETED D WHERE EXISTS (SELECT TOP 1 ID FROM INSERTED I WHERE I.ID=D.ID AND I.NumberTVA<>D.NumberTVA))

UPDATE FacturesTVA
SET State=1 -- Занимаем
WHERE ID IN (SELECT NumberTVA FROM INSERTED I WHERE EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND D.NumberTVA<>I.NumberTVA))

/* Если обновляется поле Registred на 1, тогда мы регистрируем сумму на соответствующую фирму*/
SELECT * INTO #TMP1 FROM INSERTED I WHERE I.Registred=1 AND EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND D.Registred=0)
IF @@ROWCOUNT>0
EXEC Factures_REGISTRATION


/* Если обновляется поле Registred на 0, тогда мы дерегистрируем сумму на соответствующую фирму*/
SELECT * INTO #TMP2 FROM INSERTED I WHERE I.Registred=0 AND EXISTS (SELECT TOP 1 ID FROM DELETED D WHERE D.ID=I.ID AND D.Registred=1)
IF @@ROWCOUNT>0
EXEC Factures_DEREGISTRATION



SELECT ID INTO #TMP FROM INSERTED
EXECUTE TR_UpdateTransactionLog 'U'

EX:


----------

Вы сами понимаете, что в MS SQL рбота с БД идет в виде множества, а при вызове триггера, там может быть не только одна таблица. Но эти все селекты катострофически уменьшают скорость. Посоветуйте, как в этом случае поступить. Какой метод выбрать ?
...
Рейтинг: 0 / 0
Нормально ли иметь такие тригеры ?
    #32020148
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Улучшить работу триггера можно сократив количество UPDATE-ов до минимально необходимого, например:

/*Если изменяется Номер Товара-Транспортной накладной*/
IF UPDATE(Number) -- Если изменяется поле Номер

IF EXISTS (SELECT 1 FROM INSERTED I
INNER JOIN DELETED D ON I.ID=D.ID
WHERE D.Number<>I.Number) -- и есть несовпадающие старые и новые значения

BEGIN

UPDATE FacturesTransport
SET State=0 -- Освобождаем
FROM FacturesTransport F
INNER JOIN DELETED D ON F.Number = D.Number
INNER JOIN INSERTED I ON I.ID=D.ID
WHERE I.Number<>D.Number

UPDATE FacturesTransport
SET State=1 -- Занимаем
FROM FacturesTransport F
INNER JOIN INSERTED I ON F.Number = I.Number
INNER JOIN DELETED D ON I.ID=D.ID
WHERE I.Number<>D.Number

END

и другое в том-же духе.
...
Рейтинг: 0 / 0
Нормально ли иметь такие тригеры ?
    #32020149
Mout1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы посоветовал разделить вариант одной изменяемой записи и нескольких. В случае с несколькими создал бы курсор и отработал бы с ним, проверяя каждую запись по всем параметрам, причем проверку также бы структурировал, чтобы избижать излишних проверок.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нормально ли иметь такие тригеры ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]