Подскажите, если не трудно.
У меня для таблицы на insert есть тригер, и один раз мне нужно в нее вставить сразу очень много записей, естественно этот запрос, вот такого вида:
отрабатывает стршно долго (на каждый insert срабатывает тригер, и тратится время на его исполнение)
причем, природа тригера такая, что его можно вызвать и один раз, после всех insert'ов, и он все приведет в порядок, да даже и без этого — в тригере же есть таблица inserted — так вот как сделать что бы в ней были все всталяемые записи? а то у меня в этой таблице всегда одна запись.
в каком случае в таблице insered содержится несколько сразу записей?
Отсюда хочу сгрупировать все вставки как бы в один запрос (думаю это batch) и что бы тригер выполнился после него.
Спасибо за помощь!
WBR, AsM
P.S. сорри если данный вопрос уже задавали... что то поиск не работает.
Здравствуйте, _AsM, Вы писали:
_AM>Доброе время суток, All.
_AM>Подскажите, если не трудно. _AM>У меня для таблицы на insert есть тригер, и один раз мне нужно в нее вставить сразу очень много записей, естественно этот запрос, вот такого вида:
_AM>
_AM>отрабатывает стршно долго (на каждый insert срабатывает тригер, и тратится время на его исполнение) _AM>причем, природа тригера такая, что его можно вызвать и один раз, после всех insert'ов, и он все приведет в порядок, да даже и без этого — в тригере же есть таблица inserted — так вот как сделать что бы в ней были все всталяемые записи? а то у меня в этой таблице всегда одна запись. _AM>в каком случае в таблице insered содержится несколько сразу записей?
_AM>Отсюда хочу сгрупировать все вставки как бы в один запрос (думаю это batch) и что бы тригер выполнился после него.
_AM>Спасибо за помощь! _AM>WBR, AsM
_AM>P.S. сорри если данный вопрос уже задавали... что то поиск не работает.
Вставлять во временную таблицу, и после этого --
INSERT INTO [твоя таблица] SELECT * FROM [временная таблица]
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Если триггер обрабатывает каждую запись и написан правильно , то это не поможет. AS>Может перенести логику в расширенную процедуру.
Почему не поможет? Триггер срабатывает не на вставку записи в таблицу, а на отдельную команду (в данном случае INSERT). А сколько записей эка комманда затронет -- не важно.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Я в курсе на что срабатывает триггер. AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.
Тогда тебе однозначно следует почитать исходное сообщение.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, Lloyd, Вы писали:
AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.
inserted не лопатится.
Но все равно реализовать через insert into не удасться, т.к. на самом деле у меня все более запущено...
таблиц много, во всех есть тригеры, в самом простом варианте я хотел собирать в некоторых местах все выполняющиеся insert'ы (в разные таблицы (работа с базой идет через свой обьект)) и потом накомившиеся запросы посылать сразу, что бы тригер отработал один раз, но, как выясняется это непросто... тем более что эта фигня должны быть изолированой для каждого пользователя.
Но из сложившийся ситуации хочется как то выйти... сейчас думаю использовать @@SPID
буду иметь таблицу параметров сессии, там устанавливать в какой то момент флаг что бы тригер не отрабатывал (соответственно в тригере проверку если не надо, то не делать действие... а потом включать...) ох и кривуще... никто не имеет мыслей, как бы это по нормальному, если можно..., и вопрос возник тут... надо тело тригера как то уметь выполнять когда надо...
как можно выполнить тригер не выполняя insert? что то типа "execute trigger..."
Здравствуйте, _AsM, Вы писали:
AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.
_AM> inserted не лопатится. _AM>Но все равно реализовать через insert into не удасться, т.к. на самом деле у меня все более запущено... _AM>таблиц много, во всех есть тригеры, в самом простом варианте я хотел собирать в некоторых местах все выполняющиеся insert'ы (в разные таблицы (работа с базой идет через свой обьект)) и потом накомившиеся запросы посылать сразу, что бы тригер отработал один раз, но, как выясняется это непросто... тем более что эта фигня должны быть изолированой для каждого пользователя. _AM>Но из сложившийся ситуации хочется как то выйти... сейчас думаю использовать @@SPID _AM>буду иметь таблицу параметров сессии, там устанавливать в какой то момент флаг что бы тригер не отрабатывал (соответственно в тригере проверку если не надо, то не делать действие... а потом включать...) ох и кривуще... никто не имеет мыслей, как бы это по нормальному, если можно..., и вопрос возник тут... надо тело тригера как то уметь выполнять когда надо... _AM>как можно выполнить тригер не выполняя insert? что то типа "execute trigger..."
_AM>Не смеяться _AM>WBR, AsM
Логику триггера вынести в хранимую процедуру, и из триггра ее вызывать.