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

пользователь должен запускать отчет (отчет RS с процедурой внутри),
предварительно загрузив данные из экселя и аксесса в некоторые текущие таблицы.
предполагается, что текущие таблицы очищаются перед загрузкой.
надо сделать так, чтобы после заливки эти данные скопировались в соответствующие исторические таблицы
+ дата и юзер (кто и когда залил) сохранить туда же.
т.е. отчет будет строиться по только что залитому, а то, что там было до этого, надо сохранять.

первое, что пришло в голову, это повесить триггеры на текущие таблицы,
но не катит, т.к. заливают стандартным Import/Export визардом, не сохраняя пакет,
а по умолчанию там используется Fast Load и в нем не выставлен FIRE_TRIGGERS,
в результате триггер не срабатывает.

что можно предпринять?
могу менять процедуру-отчет, чтобы она кроме построения отчета еще и копировала.
как можно проверять, что данные были перезалиты и надо их скопировать в исторические таблицы?
3 мар 14, 18:53    [15665087]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Exproment
Member

Откуда:
Сообщений: 416
o-o,
В SSRS в качестве источника можно указать Excel файл - чем вам не подходит такой вариант ? )
3 мар 14, 19:01    [15665121]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Exproment,

так тем и не подходит, что гружу не я, и пакет им навязать невозможно,
грузить хотят сами как им удобно.
а удобно им визардом, каждый раз с нуля.
и установки по умолчанию в генерируемом пакете успешно игнорируют триггер.
3 мар 14, 19:06    [15665150]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Exproment
Member

Откуда:
Сообщений: 416
Если на таблице есть уникальный Primary key для каждой новой записи, то вам должен подойти Change Data Capture.

Настраиваете его на свою таблицу, в которую идет импорт(и которая очищается каждый раз, если я правильно вас понимаю), затем из логов CDC строите свою историю.

Еще моно использовать Stage область - перманентная таблица, которая логически выступает в роли временной. Вы её можете опрашивать и понимать - если в ней что-то изменилось, то это новые данные и их надо переливать - тупой способ. Хотя при таких вводных боюсь умного способа нет)
3 мар 14, 19:18    [15665221]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Exproment
Member

Откуда:
Сообщений: 416
o-o
как можно проверять, что данные были перезалиты и надо их скопировать в исторические таблицы?

o-o, только вопрос - как при таком подходе вы хотите поддерживать параллельные операции ?
3 мар 14, 19:19    [15665231]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
у меня пока нет никакого подхода, триггер-то при тесте всего полчаса назад обломался :)
я вот сразу за советом к общественности.
неверняка же велосипед изобретаю
3 мар 14, 19:24    [15665263]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
o-o
что можно предпринять?
могу менять процедуру-отчет, чтобы она кроме построения отчета еще и копировала.
как можно проверять, что данные были перезалиты и надо их скопировать в исторические таблицы?

В текущих таблицах иметь дату загрузки.
В служебной таблице запоминать последние загруженные в историческую таблицу даты. И перегружать то что больше этой даты.
3 мар 14, 19:30    [15665296]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Exproment
Member

Откуда:
Сообщений: 416
o-o, кстати, а как ваш визард вообще отключает триггеры ? Выполняет Alter table перед началом инструкции ? Вы профайлером мониторили ?

Первый же ответ из гугла читайте:
3 мар 14, 19:35    [15665316]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
да почему мой-то?
самый что ни на есть MS-овский.

и о чем ссылка?
о том же самом, что за это ответственна опция FIRE_TRIGGERS,
o-o
а по умолчанию там используется Fast Load и в нем не выставлен FIRE_TRIGGERS,
в результате триггер не срабатывает.

еще раз.
не катит вариант с триггером, т.к. я не могу бегать ко всем пользователям
и рассказывать им, что вот не просто так юзайте визард, а сохраните пакет и опцию выставьте.
и мой пакет, где я могу выставить, использовать не будут.
уже мне отвечено: грузить они будут, как им бог на душу положит.
а наше дело все, что загрузили, сохранять в истории.
и мне сейчас надо решить, как это организовать,
т.к. невозможно протолкнуть вариант "грузим все моим пакетом".
от этого как раз и уходят. внутренние разборки.
сейчас в моде требовать автономию.
3 мар 14, 19:49    [15665382]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Exproment
Если на таблице есть уникальный Primary key для каждой новой записи, то вам должен подойти Change Data Capture.


Before a capture instance can be created for individual tables, a member of the sysadmin fixed server role must first enable the database for change data capture.

я db_owner, но ни разу не sysadmin
3 мар 14, 19:55    [15665425]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Ivan Durak
o-o
что можно предпринять?
могу менять процедуру-отчет, чтобы она кроме построения отчета еще и копировала.
как можно проверять, что данные были перезалиты и надо их скопировать в исторические таблицы?

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


ок, даты организую.
т.е. "отчетная" процедура первым шагом идет смотреть макс. дату в исторической
и догружает из текущих, если в них дата свежее?
тогда вроде и не надо служебную таблицу.
или я что-то упускаю?
3 мар 14, 20:01    [15665453]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
o-o
Ivan Durak
пропущено...

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


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

да, типа того. Просто чтобы облегчить поиск максимальной даты в огромной исторической таблице - можно создать служебную.
4 мар 14, 10:47    [15667766]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Сделайте так, чтобы импорт выполнялся не в рабочую таблицу, а в буферную. Затем распоряжайтесь буфером при помощи джоба, например. Можно сразу писать данные в таблицу истории.
4 мар 14, 14:56    [15670031]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Владислав Колосов,

и так в буферную.
вообще в другой базе обитает.
отчетная процедура себе оттуда копирует,
ну заодно теперь и в историческую сложит.
только никакого джоба не выйдет.
еще раз, я только лишь db_owner (в обеих базах).
пока тестирую с датами.
4 мар 14, 15:15    [15670224]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Если Вы db_owner, то может попробовать ограничить права на ALTER TABLE? Если пакет, конечно, с ошибкой не будет вылетать.
4 мар 14, 15:27    [15670354]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Владислав Колосов,

зачем мне права-то ограничивать?
мне надо было найти способ копирования данных в history,
не используя триггеры (т.к. визард их обходит), джобы, cdc, etc т.к. прав sysadmin не имею.
надо наверное прикрывать тему, вроде все уже получилось.
неужели так криво объясняю?

было так: надо им отчет, кладут они на шару свои эксели/аксессы,
просят обработать, мой пакет все заливает в таблички и запускает отчет.
экспортирую в эксель и им отсылаю, ВСЕ!
НО они повадились подменять файлы, уже после сгенеренного отчета подкладывают
другие исходные данные, а потом орут, что так оно и было, а отчет наш неправильный.
сей бардак порешили устранить (не я. у них свои междоусобицы тут):
данные они сами будут в таблицы заливать, как угодно.
отчет же должен иметь "оправдание" : в исторических таблицах должны лежать копии данных,
на к-ых отчет построен. с указанием юзера, залившего данные, + дата.

ок, вешаю триггер на таблицy, куда льют, чтобы копировал залитое.
а он НЕ СРАБАТЫВАЕТ, если используют стандартный Import/Export визард, к-ый в SSMS.
ибо по умолчанию он использует Fast Load, обходящий триггеры.
а они его именно и используют.

вот ищу обходные пути.
ну и добавляю в заливаемые таблицы 2 defaults: original_login() + getdate(),
а процедура отчета теперь перекидывает данные в нашу базу + копирует в исторические таблицы,
если дата свежее. юзер и дата берутся из таблицы, куда заливали. авторизация виндовая, вроде все работает
4 мар 14, 16:02    [15670729]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
ок, вешаю триггер на таблицy, куда льют, чтобы копировал залитое.
а он НЕ СРАБАТЫВАЕТ, если используют стандартный Import/Export визард, к-ый в SSMS.
ибо по умолчанию он использует Fast Load, обходящий триггеры.
а они его именно и используют.

Fast Load - это bulk insert
Для его использования нужны права.
Нет прав на bulk insert- нельзя использовать bulk insert - можно использовать простой insert - триггер сработает
4 мар 14, 16:05    [15670757]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Glory,

вы намекаете, что они, да даже и я,
имеем server-level permission ADMINISTER BULK OPERATIONS -- право уровня сервера???
даже не смешно!
на сервер у меня только CONNECT SQL + VIEW ANY DATABASE,
а гружу я визардом преспокойно
4 мар 14, 16:38    [15671066]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
o-o
данные они сами будут в таблицы заливать, как угодно.
отчет же должен иметь "оправдание" : в исторических таблицах должны лежать копии данных,
на к-ых отчет построен. с указанием юзера, залившего данные, + дата.
Административные проблемы программно не решить. Что помешает им орать, что вы специально исказили данные в исторических таблицах? Или неправильно их туда перенесли? Или еще 100500 причин...
4 мар 14, 16:38    [15671069]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
я подозреваю, мы о разном.
вот что использует визард (это из сохраненного пакета,
сгенеренного визардом для обычного импорта в таблицу из экселя )

К сообщению приложен файл. Размер - 12Kb
4 мар 14, 16:41    [15671098]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
вы намекаете, что они, да даже и я,
имеем server-level permission ADMINISTER BULK OPERATIONS -- право уровня сервера???
даже не смешно!

А вы знаете еще команды добавления в таблицу, кроме INSERT и BULK INSERT ?
Причем при первой триггера как раз всегда срабатывают, а вот для второй

FIRE_TRIGGERS
Specifies that any insert triggers defined on the destination table execute during the bulk-import operation. If triggers are defined for INSERT operations on the target table, they are fired for every completed batch.

If FIRE_TRIGGERS is not specified, no insert triggers execute.
4 мар 14, 16:42    [15671102]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
invm
Что помешает им орать, что вы специально исказили данные в исторических таблицах? Или неправильно их туда перенесли? Или еще 100500 причин...


помните?: "Ложил я на них с прибором"
(Чёрная роза - эмблема печали, красная роза - эмблема любви (С))

я давно уже занимаюсь у них своими делами,
и на их местные разборки и хотелки -- вон цитата выше :)
мы -- внешние консультанты, нам по барабану. что попросили, то и зафигачим.
начальница это придумала и своей идеей горда.
задача консультанта -- поддерживать начальника со стороны клиента в своем самообманном довольстве.

не воспринимайте все так серьезно,
вот Вы, invm, конкретно мне это уже раза 3 говорили :)

а мне некуда бежать с подводной лодки.
какая-никакая работа + возможность изучать, чем и пользуюсь.
4 мар 14, 16:52    [15671211]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
Glory
o-o
вы намекаете, что они, да даже и я,
имеем server-level permission ADMINISTER BULK OPERATIONS -- право уровня сервера???
даже не смешно!

А вы знаете еще команды добавления в таблицу, кроме INSERT и BULK INSERT ?
Причем при первой триггера как раз всегда срабатывают, а вот для второй

FIRE_TRIGGERS
Specifies that any insert triggers defined on the destination table execute during the bulk-import operation. If triggers are defined for INSERT operations on the target table, they are fired for every completed batch.

If FIRE_TRIGGERS is not specified, no insert triggers execute.


господи.
вот уже 3-ий раз пишу: про эти FIRE_TRIGGERS в курсе.
поэтому триггер и не срабатывает.

какое предоставить доказательство, что не имею серверных прав?
сами попробуйте, юзая визард студии с правами только db_owner-а,
загрузить эксельный файл в таблицу.
а потом расскажите, как это удалось обойти проверку прав на BULK INSERT.
уже писал Гость333, что это и не INSERT, и не BULK INSERT, а некий INSERT BULK, и его профайлер покажет.
так что даное еще и третье.
щас найду тему...
4 мар 14, 16:58    [15671272]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
o-o
Guest
вот примерно отсюда начиная 14738094 об этом третьем варианте.
хотя до меня так и не дошло толком, но оно есть. как суслик.
и все мы его юзаем. тем же визардом, например

кто что знает и может поделиться сведениями, плиз, поделитесь!
хоть какой-то толк будет от очередной хотелки в нашем дурдоме :)
4 мар 14, 17:05    [15671330]     Ответить | Цитировать Сообщить модератору
 Re: отследить загрузку из SSIS-пакета без триггера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
invm
o-o
данные они сами будут в таблицы заливать, как угодно.
отчет же должен иметь "оправдание" : в исторических таблицах должны лежать копии данных,
на к-ых отчет построен. с указанием юзера, залившего данные, + дата.
Административные проблемы программно не решить. Что помешает им орать, что вы специально исказили данные в исторических таблицах? Или неправильно их туда перенесли? Или еще 100500 причин...


Если так все плохо, то можно исходник сохранять с экспортированной выборкой.
4 мар 14, 17:33    [15671532]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить