Запуск DTS пакета из SQL кода

OIO

Необходимо вызвать выполнение DTS пакета из тела триггера. Для этого использую следующую строчку:EXEC master..xp_cmdshell 'dtsrun /S igor /E /N test_ora /L C:\freq.log',где igor - имя сервера, test_ora - название пакета.При этом выдает ошибку, мол, не найден клиент Oracle и сетевые компоненты.При запуске пакета вручную, все работает нормально.Помогите решить проблему.
24 ответа

OIO

права


OIO

Не совсем понятно как эта статья относится к моему случаю...


OIO

Там расписано когда и под кем пускается пакет!Вы только название статьи прочитали или всё же удосужились и оглавление осилить?


OIO

Да, но я выполняю пакет на своем компьютере, который не подключен к сети, т.е. все эти вещи про пользователей здесь ни при чем...


OIO

Я не знаю каким образом, но та же строчка, запущенная на выполнение сегодня заработала! Вчера я перезагружал машину, чего только не делал... А заработало только сегодня. Всетаки есть у них какая-то душа что ли...Но вопрос не в этом. Сегодня попробовал создать триггер вставки, у которого в теле только одна эта строчка. Добавляю данные, и он начинает выполнение пакета, по так и не заканчивает. Время выполнения уходит за 5 мин, дальше ждать не смог. В чем беда?


OIO

А случаем нет там никаких MsgBox-ов?


OIO

Никаких нет, просто видно, что после вставки нового элимента в таблицу, запускается триггер, пишет внизу, что выполняется запрос и все... время идет и ничего.


OIO

up


OIO

Профилером посмотрите, что реально на сервер отсылается.


OIO

Попробую, хотя пока не понимаю, о чем именно Вы говорите.


OIO

Никаких нет, просто видно, что после вставки нового элимента в таблицу, запускается триггер, пишет внизу, что выполняется запрос и все... время идет и ничего.
А DTS наверное запускаетеся из триггера для того, чтобы куда-то там экспортировать обновленные/добавленные в этой же таблице записи ??


OIO

Вот триггер:CREATE TRIGGER Girls_insert_trigger on GirlsAFTER INSERTASEXEC master..xp_cmdshell 'dtsrun /S Igor /E /N fromMSToOracle'При добавлении данных в таблицу Girls, эти данные (из таблицы Girls) должны экспортироваться в аналогичную табличку в Оракле. Так что Вы правы. Вы, наверное, хотите сказать, что в то время как к таблице обращается триггер, из него же вызывается выполнение ДТС пакета, все вместе и приводит к проблеме? Если так, то почему?


OIO

Вот триггер:CREATE TRIGGER Girls_insert_trigger on GirlsAFTER INSERTASEXEC master..xp_cmdshell 'dtsrun /S Igor /E /N fromMSToOracle'При добавлении данных в таблицу Girls, эти данные (из таблицы Girls) должны экспортироваться в аналогичную табличку в Оракле. Так что Вы правы. Вы, наверное, хотите сказать, что в то время как к таблице обращается триггер, из него же вызывается выполнение ДТС пакета, все вместе и приводит к проблеме? Если так, то почему?
Вы в курсе того, что транзакция, в которой выполняется ваш триггер, блокирует добавленные записи ? И что без грязного чтения эти данные невозможно прочитать в _другом коннекте_ ? А xp_cmdshell 'dtsrun именно и есть тот другой коннект. Так что вам нужно менять идеалогию решения.


OIO

Я подозревал, что может быть ситуация похожая на ту, которую Вы описали, но тот же триггер работает, если запускать другой пакет ДТС. Например, при вставке данных в таблицу Girls, они пересылаются (той же командой) в другую базу на этом же сервере (МС Сервер). Почему тогда это работает?


OIO

В предыдущем посте был НЕПРАВ! Действительно не работает. Помогите, пожалуйста, тогда решить задачу. Мне необходимо, чтобы после операций insert, update выполнялся пакет DTS по переносу обновленных данных. Как мне это сделать?


OIO

up


OIO

А что, обязательно DTS нужен? Имхо, через линкед сервер можно сделать все то же самое... Только права настроить


OIO

Мне необходимо сделать через DTS. Это тестовое задание для меня, устраиваюсь на работу. Впоследствии этот проект будет расширен.


OIO

Мне необходимо сделать через DTS. Это тестовое задание для меня, устраиваюсь на работу. Впоследствии этот проект будет расширен.
Ваша проблема в непонимании приципов блокировок данных в MSSQL. А не в собственно в DTS


OIO

Я понял, о чем Вы говорите, что так как я пытался сделать это раньше, неправильно и приводит к блокировке. Я только начинаю разбираться с MS Server и СУБД в общем, поэтому и задаю вопросы. А Вы вместо обяснения мне мого незнания (что я, в принципе, и сам знаю), лучше бы помогли, объяснили как это сделать, если это вообще возможно, если нет, то почему и как это делают по-другому.


OIO

Вам уже давно все ответили:
без грязного чтения эти данные невозможно прочитать в _другом коннекте_
Если не знаете, что это такое, то читайте BOL -> SET TRANSACTION ISOLATION LEVEL.Off: я бы на такую работу не пошел, iiwy...


OIO

Я понял, о чем Вы говорите, что так как я пытался сделать это раньше, неправильно и приводит к блокировке. Я только начинаю разбираться с MS Server и СУБД в общем, поэтому и задаю вопросы. А Вы вместо обяснения мне мого незнания (что я, в принципе, и сам знаю), лучше бы помогли, объяснили как это сделать, если это вообще возможно, если нет, то почему и как это делают по-другому.
Вообще-то для решения такой серьезной задачи как репликация данных между разными СУБД как раз и нужно серьезно изучать особенности работы каждой из них. А что конкретно вам нужно изучить для выбранного вами пути решения через DTS, я уже вроде указал. Вам нужно изучить что, почему и как долго блокирует MSSQL при добавлении данных в таблицы. И как блокировки одного коннекта обходить в других коннектах.mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\acdata.chm::/ac_8_con_7a_6fhj.htm


OIO

Спасибо за ответы. Буду разбираться. Но хочется услышать Ваше мнение. Один из пунктов задания буквально звучит так:Сочинить тригер(ы), по которому(которым) при операциях insert и update будут создаваться задания для DTS по переносу данных в Oracle.Можно ли такую задачу решить каким-то другим способом или необходимо заниматься, как Вы сказали "грязным чтением"?