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

Откуда:
Сообщений: 325
Как вы считаете, нормально ли использовать Truncate Table внутри триггера?

Задача: есть таблица A с предвычисленными значениями на основе других таблиц B, C, D. То есть по сути A - это кэш. Чтобы каждый раз не считать - посчитали один раз и положили в таблицу A. Как только B, C, D изменяются (after delete, insert, update) - в триггере очищается кэш через Delete A. Есть мысль заменить Delete A на Truncate Table A, так как этот оператор более подходит к задаче. Возникают вопросы: 1) как все это будет работать в многопользовательской среде, не будет ли проблем? 2) смущает что нужно всем дать права Alter Table на таблицу A, чтобы была возможность в триггере выполнить Truncate Table A
21 июн 17, 12:26    [20580184]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Чтобы всем этим не заморачиваться, придумали временные таблицы.
21 июн 17, 12:30    [20580203]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
sraider
Member

Откуда:
Сообщений: 325
Гавриленко Сергей Алексеевич
Чтобы всем этим не заморачиваться, придумали временные таблицы.


Нужно чтобы данные были общими между разными подключениями.
if object_id(N'tempdb..##mXJ5pbjLA4zsRs4WQWbQ2hY8FnYMlscN') is not null truncate table ##mXJ5pbjLA4zsRs4WQWbQ2hY8FnYMlscN
Так? С двумя решетками и уникальным именем?
21 июн 17, 12:46    [20580296]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
sraider,

и получить дедлок по sch-m когда один прочитал/пишет другой сбрасывает
21 июн 17, 12:48    [20580305]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
sraider
Как вы считаете, нормально ли использовать Truncate Table внутри триггера?

Задача: есть таблица A с предвычисленными значениями на основе других таблиц B, C, D. То есть по сути A - это кэш. Чтобы каждый раз не считать - посчитали один раз и положили в таблицу A. Как только B, C, D изменяются (after delete, insert, update) - в триггере очищается кэш через Delete A. Есть мысль заменить Delete A на Truncate Table A, так как этот оператор более подходит к задаче. Возникают вопросы: 1) как все это будет работать в многопользовательской среде, не будет ли проблем? 2) смущает что нужно всем дать права Alter Table на таблицу A, чтобы была возможность в триггере выполнить Truncate Table A


Всё от юзера и задачи зависит.
Можно делать по-разному, например, так:

создавать записи с одним флагом (что-то похожее на timestamp), хранящимся х.з. где в другой таблице, затем в указанном вами триггере менять этот флаг и далее писать с новым и читать соответственно записи с новым флагом, со старым флагом считаются устаревшими. Можно сделать вью.
И удалять устаревшие где-то сбоку кусками.
21 июн 17, 13:36    [20580482]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31371
sraider
Есть мысль заменить Delete A на Truncate Table A, так как этот оператор более подходит к задаче.
Нельзя, придётся удалять DELETE

Но вообще подумайте про обновление MERGE
По моему, для кэша он больше подходит, если только при малейшем обновлении B, C, D таблица A не меняется кардинально.
21 июн 17, 14:26    [20580684]     Ответить | Цитировать Сообщить модератору
 Re: Truncate Table внутри триггера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Truncate table вообще не нормально использовать по каждому чиху.
21 июн 17, 15:05    [20580862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить