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

Откуда: USA, PA
Сообщений: 457
Добрый день всем!
Имеется такая проблема: в таблице имеется триггер который запускается при изменении одного поля в триггере берется дата измененной записи и вызывается VB Script с датой переданной в качестве параметра.
В скрипте автоматически генерируется и сохраняется батник со строками вызова приложения которое может работать довольно долго, а последняя строчка вызывает другой скрипт который обновляет таблицу - вставляя текущее время и флаг, это нужно сделать когда программа отработала.
Проблема заключается в следующем - первый скрипт вызывается без проблем, он создает батник в папке, но вот батник из этого скрипта не запускается, складывается ощущение что это какое-то ограничение из SQL Server, т.к. если запустить этот скрипт вручную, то все отрабатывает отлично.
Буду благодарен за любую помощь.
create trigger [dbo].[RunReports] on [dbo].[Balanced]
after insert, update
as
      set nocount on
      
      if update(Balanced)
      begin
                  
            declare @Date datetime
            declare @IsBalanced bit
            declare @IsReportsRun bit
            select	@Date = BalancedDate,
					@IsReportsRun = ReportsRun, 
					@IsBalanced = Balanced from INSERTED                      
           
            if @IsReportsRun = 0  and @IsBalanced = 1
                  begin                      
						declare @sQuery varchar(8000)
						set @sQuery = 'CScript "C:\RunVC.vbs" ' + convert(varchar(10),@Date,101)					
						EXEC XP_CMDSHELL @sQuery, NO_OUTPUT
                  end 
      end
GO
17 сен 12, 22:06    [13179182]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Gc2112
складывается ощущение что это какое-то ограничение из SQL Server
Свои ощущения оставьте своей девушке.

1. как вы определяете запустилось или нет? Неужели по результату его работы? (Т.е. NO_OUTPUT - моветон, как вы контролируеие процесс, где проверка возврата?)
2. Обновится может и более одной строки в таблице и триггер их "пропустит"
3. Странное у вас "решение" через sys.xp_CmdShell, мягко говоря. Чем вам Job не угодили? и зачем генерировать батник динамически?
17 сен 12, 23:41    [13179502]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
ну примерно таких ответов я и ожидал от завсегдатаев скуля.

на самом деле батник запускался, проблема была не в триггере, а во внешней программе которая генерирует отчеты. каким-то образом не подхватываются динамические ODBC настройки для Backup сервера.

2. Обновится может и более одной строки в таблице и триггер их "пропустит"
Это понятно, просто специфика работы приложения исключает возможность таких ситуаций. Пользователь имеет возможность установить сбалансированным только один день за раз и не может ничего сделать пока не сгенерируются все отчеты за этот день.

3. Странное у вас "решение" через sys.xp_CmdShell, мягко говоря. Чем вам Job не угодили? и зачем генерировать батник динамически? Отчеты должны генерироваться только при установке флага IsBalanced =1 Динамический батник генериется в зависимости от даты - т.к. отчеты генерируются дневные, недельные, месячные и квартальные.
17 сен 12, 23:58    [13179553]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Gc2112
т.к. если запустить этот скрипт вручную, то все отрабатывает отлично.
И запускали вы его под той же учетной записью, под которой работает сам SQL Server?
18 сен 12, 00:14    [13179600]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
И запускали вы его под той же учетной записью, под которой работает сам SQL Server?
нет, в этом наверное и проблема. в SQL Server залогинен как sa c SQL Server Authentification, в windows 2008 R2 тоже как админ, но под другим логином.
может можно указать в скрипте каким-то образом запускать батник под админом?
18 сен 12, 00:36    [13179654]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Gc2112
может можно указать в скрипте каким-то образом запускать батник под админом?
Можно. Настроив Proxy Account. Но не нужно.

Но совершенно непонятно зачем вместо запуска Job запускать всё через изменение таблицы.
Таблица это данные, а действие это действие.

Gc2112
Отчеты должны генерироваться только при установке флага IsBalanced =1
Это что за аргумент?
Совершенно неважно, проверяется это условие в процедуре (или JOB), ставится ли значение таблицы в той же процедуре (или JOB).
Но значение таблицы это не действие.
А в JOB-е можете настроить и от кого запускать.

Ну на крайняк, если вы не хотите вникать, т.е. не программист, сделайте запуск Job весто sys.xp_СmdShell.

И кстати, не нужно контролить что поле принимает значение только для одной строки, ибо Job невозможно запустить одновременно параллельно.

А может вы специально извращаетесь, чтобы этот "продукт" быстро сдох?
18 сен 12, 11:08    [13180719]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
автор
Это что за аргумент?
Совершенно неважно, проверяется это условие в процедуре (или JOB), ставится ли значение таблицы в той же процедуре (или JOB).
Но значение таблицы это не действие.
А в JOB-е можете настроить и от кого запускать.

т.е. вы хотите сказать что нужно настроить JOB который к примеру выполняется каждую минуту или 5 и мониторит изменение поля - и если какие-то условия выполняются то запускаются внешние программы.
18 сен 12, 16:54    [13183824]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
invm
Member

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

Вам отчеты надо строить синхронно или асинхронно? И, если синхронно, то почему? И что случится, если начать их строить асинхронно?
18 сен 12, 18:32    [13184483]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
автор
Вам отчеты надо строить синхронно или асинхронно? И, если синхронно, то почему? И что случится, если начать их строить асинхронно?

можно и асинхронно, главный момент состоит в том что нужно обновить таблицу когда все отчеты сгенерятся, поэтому и генерируется bat файл в котором последняя строка вызывает скрипт для обновления этой таблицы. Если это можно сделать внутри SQL Server - буду только рад услышать как это можно сделать.
18 сен 12, 18:45    [13184528]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Gc2112
т.е. вы хотите сказать что нужно настроить JOB который к примеру выполняется каждую минуту или 5 и мониторит изменение поля - и если какие-то условия выполняются то запускаются внешние программы.
Если происходит действие извне, то оно вместо изменения поля таблицы вызывает JOB.

Кто делает отчёты? Если это на сервере, пусть делает JOB и последний степ пусть меняет таблицу (ходя совершенно непонятно зачем).
Блин, думайте нормально (все-целое видение) об организации процессов.
18 сен 12, 19:26    [13184715]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
автор
Если происходит действие извне, то оно вместо изменения поля таблицы вызывает JOB.

Кто делает отчёты? Если это на сервере, пусть делает JOB и последний степ пусть меняет таблицу (ходя совершенно непонятно зачем).
Блин, думайте нормально (все-целое видение) об организации процессов.

Таблица нужна для отображения состояния сгененрированных отчетов(выполнено, не запускалось, в процессе) на определенную дату на веб портале.
Отчеты написаны в Crystal Reports и генерятся с помощью программы Visual Cut которая рассылает e-mail с вложенными отчетами и закачивает их в БД.
Строки запуска зависят от даты на которую строится отчет их кол-во также может менятся - ок это все можно сделать в SQL, но как определить что все они завершились чтобы перейти к последнему степу - чтобы обновить поле таблицы?
18 сен 12, 20:22    [13184961]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Версия сервера?
18 сен 12, 20:43    [13185027]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 
18 сен 12, 20:49    [13185041]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Gc2112
Отчеты написаны в Crystal Reports и генерятся с помощью программы Visual Cut которая рассылает e-mail с вложенными отчетами и закачивает их в БД.
Вы можете смеяться, но я не знаю как непосредственно происходит запуск этих отчётов и через что.

Понимаете можно сделать одно и тоже 100500 способами. Если кому-то демается что только одним-двумя то это плохо. Но из всех этих вариантов надо подобрать более независимый (модульный), более простой вариант.
Можно было и с самой Crystal Reports накосячить и сделать вывернуто. Только критическое отношение ко всему сможет сподвигнуть на простоту и надёжность реализации.


Visual Cut - не знаю, но по первым впечатлениям - "ласапед".
Может поэтому и получается никому не нужное нагромождение сред вызова. TSQL / CmdShell / VB / CR / EXE - притом по кругу.
Карточный домик.

Непонятно зачем и для чего там что-то генерится.
Дата отчёта не может быть динамикой - это статический параметр. Тем более он может браться самим отчётом из базы.
Дофига непонятного зачем оно вообще нужно.
Как в анекдоте: Армейские часы с 8мью стрелками - для дезориентации противника.

Это надо было думать на раннем этапе проэктирования. А в итоге всё делается "в лоб" - т.е. заведомо далеко не правильно.

Ссори.
18 сен 12, 21:11    [13185117]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
Вот именно что решается в лоб в последнюю минуту:
изначально очтеты долны были генерироваться каждый день в 5 утра - и все это легко делалось в Windows Scheduler.
Потом пришла идея, что очтеты должны генениться когда главный админ поставит галку, что за этот день бд сбалансирована в финансовом плане - теперь приходится извращаться.
Crystal Reports - запрос клиента, SSRS даже не рассматривался.
Visual Cut - PM посчитал деньги и решил что дешевле купить стороннее приложение, чем писать своими силами.
18 сен 12, 21:22    [13185161]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Для начала, выкинуть на помойку паровоз из ВБ-скрипта и батника. Вместо них написать одну хранимую процедуру, которая через xp_cmdshell будет выполнять ваше приложение необходимое количество раз, и затем, т.к. xp_cmdshell всегда выполняется синхронно, обновлять данные в таблицах.
18 сен 12, 22:10    [13185337]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Gc2112
Потом пришла идея, что очтеты должны генениться когда главный админ поставит галку, что за этот день бд сбалансирована в финансовом плане - теперь приходится извращаться.
Doh ...
Видимо кто-то считает что у вас мало работы. Точнее вас нужно отвлечь от некоторой ... "деятельности".
18 сен 12, 23:24    [13185624]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Gc2112
Member

Откуда: USA, PA
Сообщений: 457
Небольшой update:
Удалось заработать паровоз :), но пришлось добавить еще один вагон.
Сейчас работает так:
1. Триггер запускает VB Script.
2. Скрипт динамически строит батник и запускает Win Scheduler который запускает этот батник.
3. Батник запускает программу которая рассылает отчеты в различных форматах и после этого запускает еще один скрипт на обновление таблицы.
25 сен 12, 20:23    [13221432]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Матерь божья... Потом поддерживать кому-то.
25 сен 12, 20:30    [13221462]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Ray D,

Самое печальное, что обвинят потом во всем MS SQL, а не кривую архитектуру...
25 сен 12, 20:38    [13221493]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается батник из VB Script который вызывается в триггере.  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
Gc2112
Небольшой update:
Удалось заработать паровоз :), но пришлось добавить еще один вагон.
Сейчас работает так:
1. Триггер запускает VB Script.
2. Скрипт динамически строит батник и запускает Win Scheduler который запускает этот батник.
3. Батник запускает программу которая рассылает отчеты в различных форматах и после этого запускает еще один скрипт на обновление таблицы.
Игрушка раньше была -- Incredible Toons. Очень напоминает.
25 сен 12, 22:01    [13221725]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить