Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нормально ли иметь такие тригеры ?
|
|||
|---|---|---|---|
|
#18+
Нормально ли иметь такие триггеры ? 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 рбота с БД идет в виде множества, а при вызове триггера, там может быть не только одна таблица. Но эти все селекты катострофически уменьшают скорость. Посоветуйте, как в этом случае поступить. Какой метод выбрать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2002, 06:54 |
|
||
|
Нормально ли иметь такие тригеры ?
|
|||
|---|---|---|---|
|
#18+
Улучшить работу триггера можно сократив количество 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 и другое в том-же духе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2002, 12:15 |
|
||
|
Нормально ли иметь такие тригеры ?
|
|||
|---|---|---|---|
|
#18+
Я бы посоветовал разделить вариант одной изменяемой записи и нескольких. В случае с несколькими создал бы курсор и отработал бы с ним, проверяя каждую запись по всем параметрам, причем проверку также бы структурировал, чтобы избижать излишних проверок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2002, 12:15 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32020148&tid=1824437]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 360ms |

| 0 / 0 |
