powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / что выбрать: ХП или Триггер?
11 сообщений из 11, страница 1 из 1
что выбрать: ХП или Триггер?
    #34114096
Aleah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста, ногами не бейте, можете отсылать куда угодно, лишь бы полезная была ссылка.

Из специальной проги в таблицу (назовём её tblMain) загружаются данные. Нужно проверить их правильность. Проверка достаточно сложная, точнее не простая (бух.учёт, поэтому всяких суммирований - тьма). Найденные ошибки просто записывают в отдельную табличку (назовём её tblError), т.е. даже если найдены ошибки, загрузка данных в таблицу tblMain осуществляется полностью. Вопрос, собственно, в сабже: либо повесить на таблицу триггер on insert или в спец.проге прописать, чтобы сразу за загрузкой запускалась ХП, которая будет делать тоже самое, что и триггер.
Что предпочтительней?

Понимаю, что вопрос очень общий. готов уточнить всё, что потребуется. За не компетентность - извиняйте.

P.S. вся эта байда происходит в MS SQL 2000
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34114136
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, было бы лучше задать вопрос на профильном форуме.
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34115136
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleah чтобы сразу за загрузкой запускалась ХП
как можно в многопользовательской системе проектировать сразу за.....
А если не успеешь?

IMHO
- триггер всегда хуже ХП, и прошлое тысячилетие
- делать всё на ХП - "НовыйДокумент (фффф ааа рррр олллл ддджжд)".
Там внутри - бизнес-логика по вводу нового документа (с обработкой ошибок в виде raise "В документе отсутствует дата!").
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34115241
Ivan A Kostko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 Aleah чтобы сразу за загрузкой запускалась ХП
как можно в многопользовательской системе проектировать сразу за.....
А если не успеешь?

IMHO
- триггер всегда хуже ХП, и прошлое тысячилетие
- делать всё на ХП - "НовыйДокумент (фффф ааа рррр олллл ддджжд)".
Там внутри - бизнес-логика по вводу нового документа (с обработкой ошибок в виде raise "В документе отсутствует дата!").

На мой взгляд, триггер крайне не желателен. Смотря как активно идет пополнение данных. Учтите. что табличка inserted создается оооочень медленно. Что касается ХП, то все хорошо, кроме того, как ее запускать спразу после... Хотя и это решаемо.
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34115710
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan A KostkoУчтите. что табличка inserted создается оооочень медленно.Заинтриговали. Минуту, час, сутки ? Можете подтвердить чем-нибудь свое утверждение ?
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34115841
Aleah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123 Aleah чтобы сразу за загрузкой запускалась ХП
как можно в многопользовательской системе проектировать сразу за.....
А если не успеешь?

IMHO
- триггер всегда хуже ХП, и прошлое тысячилетие
- делать всё на ХП - "НовыйДокумент (фффф ааа рррр олллл ддджжд)".
Там внутри - бизнес-логика по вводу нового документа (с обработкой ошибок в виде raise "В документе отсутствует дата!").

Всем большое спасибо. Сама система не моя - мне её передали на поддержку и доработку, поэтому по поводу многопользовательности буду ещё выяснять, но как я понял загружать данные будут
а) редко (несколько раз в месяц)
б) такими правами (на загрузку) будут обладать пара человек (а может и вовсе один)

А почему "триггер всегда хуже"?
Можете посоветовать литературу по этому поводу?
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34116081
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleahМожете посоветовать литературу по этому поводу?Как правило, чтение BOL вполне достаточно. Также рекомендуется следовать принципу "лучше один раз проверить, чем 100 раз услышать(прочитать)". И, очень полезно задавать вопросы по конкретному серверу на профильном форуме, шансы на получение правильного ответа сильно возрастают.
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34116638
Ivan A Kostko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA Ivan A KostkoУчтите. что табличка inserted создается оооочень медленно.Заинтриговали. Минуту, час, сутки ? Можете подтвердить чем-нибудь свое утверждение ?

http://www.sql.ru/forum/actualthread.aspx?tid=355450

Создайте триггер на апдэйт или инсерт. который просто будет брать данные и писать их в доп табличку... Или просто их модифицировать простетской ф-цией... Для простоты сделайте в триггере:
SELECT 1 AS is_exist WHERE EXISTS (SELECT * FROM inserted)
Больше ничего...
Сделайте добавление(или апдэйт - в зависимости от триггера) 10000 строк в таблицу с триггером, а потом без триггера. Соотношение времени огласите на сайте. У меня: 1:32 с триггером и 0:03 без него...
На мой взгляд разница очевидна!
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34117208
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan A KostkoНа мой взгляд разница очевидна!Такой пример устроит ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
use tempdb
GO
-- Создание и заполнение таблицы
CREATE TABLE t (id1 int NOT NULL, id2 int NOT NULL, PRIMARY KEY(id1, id2))
GO
INSERT INTO t (id1, id2)
SELECT so1.id, so2.id
FROM master..sysobjects so1
CROSS JOIN master..sysobjects so2
GO
-- Тестирование, каждый шаг по 2 раза, для грубой статистики
DECLARE @d datetime, @i int
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Без триггера 1 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Без триггера 2 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
GO
CREATE TRIGGER tu_t ON t FOR UPDATE
AS
DECLARE @i int
SELECT @i =  1 
RETURN
GO
DECLARE @d datetime, @i int
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер без использования INSERTED 1 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер без использования INSERTED 2 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
GO
ALTER TRIGGER tu_t ON t FOR UPDATE
AS
DECLARE @i int
SELECT @i =  1  WHERE EXISTS(SELECT * FROM INSERTED)
RETURN
GO
DECLARE @d datetime, @i int
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер c использованием INSERTED 1 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер c использованием INSERTED 2 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
GO
ALTER TRIGGER tu_t ON t FOR UPDATE
AS
DECLARE @i int
SELECT @i =  1  WHERE EXISTS(SELECT * FROM DELETED)
RETURN
GO
DECLARE @d datetime, @i int
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер c использованием DELETED 1 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Триггер c использованием DELETED 2 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
GO
DROP TRIGGER tu_t
GO
DECLARE @d datetime, @i int
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Без триггера 1 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
SELECT @d = CURRENT_TIMESTAMP, @i =  0 
WHILE @i <  1000  UPDATE t SET @i = @i +  1 , id2 = id2 +  1  WHERE id1 =  1 
PRINT 'Без триггера 2 - ' + STR(DATEDIFF(ms, @d, CURRENT_TIMESTAMP))
GO
-- Удаление таблицы
DROP TABLE t
Прогон 1 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Без триггера 1 -       2953
Без триггера 2 -         46
Триггер без использования INSERTED 1 -         60
Триггер без использования INSERTED 2 -         63
Триггер c использованием INSERTED 1 -        153
Триггер c использованием INSERTED 2 -         63
Триггер c использованием DELETED 1 -         60
Триггер c использованием DELETED 2 -        110
Без триггера 1 -         63
Без триггера 2 -         60
Прогон 2 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Без триггера 1 -       1140
Без триггера 2 -         63
Триггер без использования INSERTED 1 -        110
Триггер без использования INSERTED 2 -         46
Триггер c использованием INSERTED 1 -         76
Триггер c использованием INSERTED 2 -         63
Триггер c использованием DELETED 1 -         60
Триггер c использованием DELETED 2 -         80
Без триггера 1 -         63
Без триггера 2 -         46
Прогон 3 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Без триггера 1 -       1330
Без триггера 2 -         63
Триггер без использования INSERTED 1 -         93
Триггер без использования INSERTED 2 -         63
Триггер c использованием INSERTED 1 -         80
Триггер c использованием INSERTED 2 -         63
Триггер c использованием DELETED 1 -         93
Триггер c использованием DELETED 2 -        190
Без триггера 1 -         63
Без триггера 2 -         63

На самом деле, после создания и заполнения таблицы можно многократно выполнять шаг, начиная с комментария о тестирования и заканчивая комментарием об удалении таблицы, чтобы удалить сильные отклонения связанные либо с кэшированием, либо перекомпиляцией.
Как бы результаты несколько расходятся с Вашим утверждением о невероятно долгом создании таблиц INSERTED или DELETED, нет ?
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34118756
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleahP.S. вся эта байда происходит в MS SQL 2000
в курсе что в MSSQL триггер срабатывает для всех записей загружаемых одним insert-ом, а не накаждую запись? соответственно придется раскручивать таблицу inserted и в цикле/курсоре проверять каждую запись, что не есть гуд для производительности. Да и грузить большие объемы лучше BCP и bulk insert-ом.
здесь говорится:
Выполняйте все проверки ссылочной целостности и верности данных, используя ограничения (внешние ключи и проверки доменной целостности), вместо использования триггеров, т.к. это быстрее. Ограничьте использование триггеров только для задач аудита, специальных задач и проверок, которые не могут быть выполнены с использованием ограничений. Ограничения также сохраняют Ваше время, т.к. Вам не надо писать код для этих проверок, позволяя системе управления базами данных делать все это за Вас
...
Рейтинг: 0 / 0
что выбрать: ХП или Триггер?
    #34119286
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынниксоответственно придется раскручивать таблицу inserted и в цикле/курсоре проверять каждую запись Строго говоря, это не безусловно т.к. зависит от того, как написать эту "достаточно сложную проверку"

IMO принципиальная разница лишь в том, что триггер (если не использовать разных уловок) будет срабатывать при любом событии на которое он расчитан. А это событие может не обязательно подниматься как следствие "загрузки данных из специальной проги". В то время как ХП можно привязать именно к этому процессу.

Срабатывание триггера "всегда" это его и достоинство и недостаток одновременно. Это к вопросу о почему "триггер всегда хуже"?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / что выбрать: ХП или Триггер?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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