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

Откуда:
Сообщений: 1197
привет.

есть таблица А и таблица Б.
Надо добавить триггер на вставку в таблицу A, чтобы данные копировались в таблицу Б.
В настоящий момент я уже перенес простым insert данные которые были в А.
Вопрос: как синхронно сделать добавление триггера и перенести добавленные данные после моего инсерта данные (условие я знаю)?
т.е. как грамотно залочить таблицу на момент "окончание добавления новых записей - запуск триггера" ?
17 сен 12, 16:59    [13177613]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
relief,

как-то Вы неправильно себе триггеры представляете.
Они запускаются событиями, для которых были созданы.
И выполняются в той же транзакции, в которой выполняется команда,
приведшая к событию, для которого вызываются триггеры.
17 сен 12, 17:03    [13177660]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
aleks2
Guest
1. У тя нету PK в таблице A? Сделай.
2. У тя есть PK в таблице A - чего ты паришь нам мозги?
17 сен 12, 17:04    [13177662]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Откройте для себя таблицу inserted.
17 сен 12, 17:18    [13177783]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief,

как-то Вы неправильно себе триггеры представляете.
Они запускаются событиями, для которых были созданы.
И выполняются в той же транзакции, в которой выполняется команда,
приведшая к событию, для которого вызываются триггеры.


Видимо, я неточно объяснил.
У меня есть таблица А и таблица Б.

Таблица Б содержит копию таблицы А месячной давности.
Сейчас надо перенести данные в Б из А за последний месяц и тут же повесить в А триггер на вставку, чтобы новые записи автоматом переносились в Б.

т.е. надо чтобы после того как я перенесу в Б последние данные и до того как я создам триггер не проскочили данные в А, которые триггер не успеет обработаьть
1 окт 12, 09:54    [13247585]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
т.е. надо чтобы после того как я перенесу в Б последние данные и до того как я создам триггер не проскочили данные в А, которые триггер не успеет обработаьть

И что мешает блокировать таблицу эксклюзивно ?
1 окт 12, 09:58    [13247607]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вообще, перенос данных, зависящий от порядка переносимых записей, - это неправильно само по себе.
Не должно быть этой зависимости. И в INSERTе достаточно проверять отсутствие переносимых записей
в целевой таблице.
1 окт 12, 10:02    [13247634]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
relief
т.е. надо чтобы после того как я перенесу в Б последние данные и до того как я создам триггер не проскочили данные в А, которые триггер не успеет обработаьть
Нужно сначала создать триггер, а уже потом делать перенос отсутствующих данных. Тогда ничего не "проскочит".
1 окт 12, 10:07    [13247653]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
т.е. надо чтобы после того как я перенесу в Б последние данные и до того как я создам триггер не проскочили данные в А, которые триггер не успеет обработаьть

И что мешает блокировать таблицу эксклюзивно ?


а вот как это сделать не совсем понимаю.
подскажите как между первой и второй командой залочить таблицу А экслюзивно?

insert B
select * from A with(tablock)

create Trigger
1 окт 12, 10:10    [13247674]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
а вот как это сделать не совсем понимаю.
подскажите как между первой и второй командой залочить таблицу А экслюзивно?

Блокировки существуют до конца транзакции. Если указано.
1 окт 12, 10:12    [13247695]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
alexeyvg
relief
т.е. надо чтобы после того как я перенесу в Б последние данные и до того как я создам триггер не проскочили данные в А, которые триггер не успеет обработаьть
Нужно сначала создать триггер, а уже потом делать перенос отсутствующих данных. Тогда ничего не "проскочит".


не пойдет. потом надо переносить данные за последний месяц и исключать перенесеные уже триггером
1 окт 12, 10:15    [13247714]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
потом надо переносить данные за последний месяц и исключать перенесеные уже триггером

И что мешает "исключать перенесеные уже триггером" ?
1 окт 12, 10:16    [13247723]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
а вот как это сделать не совсем понимаю.
подскажите как между первой и второй командой залочить таблицу А экслюзивно?

Блокировки существуют до конца транзакции. Если указано.


а т.е. такая конструкция лочит А до конца транзакции

 set tran isolation level readcommitted 
begin tran

insert B
select * from A with(tablock)

create Trigger

commit tran


а вот такая не лочит А до конца транзакции?

 set tran isolation level readcommitted 
begin tran

insert B
select * from A

create Trigger

commit tran
1 окт 12, 10:19    [13247741]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
Обе не блокируют до конца транзакции
Потому в обеих командах отсутствует указание на это.
1 окт 12, 10:21    [13247754]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
Обе не блокируют до конца транзакции
Потому в обеих командах отсутствует указание на это.


меняем TABLOCK на TABLOCKX и мое утверждение верно?
1 окт 12, 10:27    [13247784]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
меняем TABLOCK на TABLOCKX и мое утверждение верно?

Нет, по-прежнему неверно.
Потому что тип блокировки и продолжительность блокировки - это разные вещи.
1 окт 12, 10:38    [13247860]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
меняем TABLOCK на TABLOCKX и мое утверждение верно?

Нет, по-прежнему неверно.
Потому что тип блокировки и продолжительность блокировки - это разные вещи.



тип изоляции поставить на SERIALIZABLE и можно оставить TABLOCK?
1 окт 12, 10:43    [13247903]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
relief
не пойдет. потом надо переносить данные за последний месяц и исключать перенесеные уже триггером
Почему не пойдёт-то, из принципа?

Это самый надёжный и простой путь, к тому же не мешающий пользователям

Другое дело, если есть какие то объективные причины, например, большой размер таблицы.
1 окт 12, 10:52    [13247972]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
alexeyvg
relief
не пойдет. потом надо переносить данные за последний месяц и исключать перенесеные уже триггером
Почему не пойдёт-то, из принципа?

Это самый надёжный и простой путь, к тому же не мешающий пользователям

Другое дело, если есть какие то объективные причины, например, большой размер таблицы.


именно
большое кол-во данных и отсутвие индексов.
1 окт 12, 10:59    [13248008]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
relief
именно
большое кол-во данных и отсутвие индексов.
ПОнятно.
Ну тогда да, можно SERIALIZABLE + TABLOCKX
Или HOLDLOCK+TABLOCKX
1 окт 12, 11:21    [13248173]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
alexeyvg
relief
именно
большое кол-во данных и отсутвие индексов.
ПОнятно.
Ну тогда да, можно SERIALIZABLE + TABLOCKX
Или HOLDLOCK+TABLOCKX


а не могли подробней рассказать как работает HOLDLOCK+TABLOCKX, и как ее использоватьв моем случае?

заранее спасибо
1 окт 12, 11:33    [13248263]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
relief
alexeyvg
пропущено...
ПОнятно.
Ну тогда да, можно SERIALIZABLE + TABLOCKX
Или HOLDLOCK+TABLOCKX


а не могли подробней рассказать как работает HOLDLOCK+TABLOCKX, и как ее использоватьв моем случае?

заранее спасибо
Как то так:

begin tran

insert B
select * from A  with(TABLOCKX,HOLDLOCK)

create Trigger...

commit tran


Только create Trigger нужно делать через EXEC(''), поскольку он должен выполнятся в отдельном батче.

Или частями выполнять в SSMS
1 окт 12, 11:52    [13248418]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Достаточно просто TABLOCKX
1 окт 12, 11:54    [13248440]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
invm
Достаточно просто TABLOCKX
Я вообще думаю что да, но меня Glory смутил :-)
1 окт 12, 12:04    [13248539]     Ответить | Цитировать Сообщить модератору
 Re: добавление триггера  [new]
relief
Member

Откуда:
Сообщений: 1197
alexeyvg
relief
пропущено...


а не могли подробней рассказать как работает HOLDLOCK+TABLOCKX, и как ее использоватьв моем случае?

заранее спасибо
Как то так:

begin tran

insert B
select * from A  with(TABLOCKX,HOLDLOCK)

create Trigger...

commit tran


Только create Trigger нужно делать через EXEC(''), поскольку он должен выполнятся в отдельном батче.

Или частями выполнять в SSMS


Спасибо.
А подскажите статью или книгу в котором хорошо разжевано как работают TABLOCKX, TABLOCK, HOLDLOCK и иже с ними в совокупности с уровнями изоляций транзакций?
1 окт 12, 12:29    [13248739]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить