2011-12-27 8 views
5

Mam problem ze znalezieniem najlepszego sposobu rozwiązania mojego problemu, proszę pamiętać, że jestem otwarty na lepsze sposoby realizacji tego zadania.Uruchomić aplikację konsoli z SQL Server po asynchronicznym wyzwalaczu aktualizacji tabeli?

Co należy zrobić, po zaktualizowaniu wartości wiersza w mojej tabeli, muszę użyć 2 pól z tej tabeli jako parametry dla aplikacji konsoli. Teraz mogę to zrobić, ustawiając wyzwalacz na stole, a następnie używając xp_cmdshell, aby uruchomić aplikację z parametrami. Jednak muszę to zrobić asynchronicznie, więc moja procedura przechowywana nie zawiesza się podczas oczekiwania na zakończenie aplikacji konsoli.

Może robię to niewłaściwie.

Używam SQL Server 2008

EDIT - Odpowiedź przez Andrij M wydaje się być najlepszym obecnie ale jak wspomniano w komentarzach Potrzebuję sposób, aby to się stało „natychmiast”. Czy można zadzwonić do pracy z SP lub wyzwalacza? a może inny sposób na osiągnięcie podobnego rezultatu?

dzięki za pomoc dla wszystkich.

EDYCJA - wybieram odpowiedź poniżej, ponieważ pomógł mi jak najlepiej znaleźć lepsze rozwiązanie. W efekcie powstało zadanie, które po prostu odpytuje moją tabelę przed inną, która śledzi zaktualizowane wiersze. wtedy, gdy mam wiersze, które muszę zaktualizować, używam xp_cmdshell, aby uruchomić moją aplikację z określonymi parametrami. wydaje się, że to rozwiązanie działa sprawnie.

+0

Do czego służy aplikacja? – UnhandledExcepSean

+0

wykonuje pewną operację wsadową w oparciu o wartości zaktualizowane w mojej tabeli, nie mogę podać więcej szczegółów. – kds6253

+0

Czy trzeba zrobić coś poza bazą danych? – UnhandledExcepSean

Odpowiedz

5

Kolejną wadą jest uruchamianie aplikacji bezpośrednio z wyzwalacza. Ma to związek z tym, że ogólnie może być zaktualizowanych więcej niż jeden wiersz. Aby uwzględnić to w wyzwalaczu, prawdopodobnie trzeba będzie zorganizować pętlę nad zaktualizowanymi wierszami i uruchomić aplikację dla każdego z osobna. Kursory są zwykle traktowane jako ostateczność, a te w wyzwalaczu jeszcze bardziej.

W takiej sytuacji najprawdopodobniej rozważyłbym utworzenie zadania agenta SQL, które odczytałoby zaktualizowane wartości z dedykowanej tabeli wypełnionej wyzwalaczem. Zadanie będzie nadal musiało korzystać z kursora, ale twój wyzwalacz nie, a najważniejsze jest to, że uruchomienie aplikacji z pracy nie zatrzyma twojego głównego procesu roboczego.

+0

To wydaje się najlepszym rozwiązaniem. Wyzwalacz wywołuje zadanie, które powinno wywołać zapytanie do tabeli i uzyskać informacje o parametrach, a następnie uruchomić plik app.exe z xp_cmdshell w zadaniu. – kds6253

+0

Czy ktoś widzi jakiekolwiek problemy z tą logiką lub możliwymi ulepszeniami? – kds6253

+0

@ kds6253: Nie jestem biegły w zajmowaniu się zadaniami SQL, w szczególności nigdy nie słyszałem o wywołaniu zadań z wyzwalaczy. Myślałem tylko o wyzwalaczu, który zalałby tylko pewien stół, nic więcej. Praca, o której wspomniałem, przebiegałaby zgodnie z harmonogramem i odpytywała tabelę. Po zetknięciu się z nowymi wierszami zacząłby wywoływać aplikację dla każdego wiersza, jeden po drugim. Jeśli wyzwalacz może * bezpośrednio * rozpocząć pracę, zobaczyłbym to jako miły bonus. –

0

Myślę, że powinieneś opracować rozszerzoną procedurę przechowywaną (DLL) zamiast wywoływania aplikacji konsoli za pomocą polecenia xp_cmd_shell.

+0

Czy istnieje alternatywa dla rozszerzonych procedur przechowywanych? – kds6253

+1

[Rozszerzone programowanie procedur przechowywanych jest przestarzałe] (http://msdn.microsoft.com/en-us/library/ms143729.aspx) –

+0

Nie wiedziałem. Dzięki. – Baatar

0

Proponuję użyć procedury CLR, ponieważ daje ona o wiele większą kontrolę nad procesem. Ale możesz można zrobić to z xp_cmdshell.

Aby to zrobić, można napisać plik wsadowy, który zostanie wywołany za pomocą xp_cmdshell. Wewnątrz pliku wsadowego uruchom aplikację konsoli odpowiednimi parametrami, używając komendy START. Spowoduje to asynchroniczne uruchomienie procesu. Plik wsadowy i wywołanie xp_cmdshell powrócą natychmiast.

+0

Pełny przykład pisania i rejestrowania procedury CLR jest więcej niż mogę zrobić tutaj. W internecie są świetne przykłady. Jeśli sztuczka 'START' nie działa, możesz również wypróbować program' AT'. Może to być wykorzystane do zaplanowania zadania do wykonania w przyszłości. Jeśli skonfigurujesz ją na przykład na sekundę lub dwie w przyszłości, powinna działać. Podkreślam jednak, że każde z tych podejść 'xp_cmdshell' byłoby hackerem. Powinieneś naprawdę spojrzeć na podstawowy projekt problemu, jeśli możesz. – mwigdahl

1

W wyzwalaczu umieść komunikat w kolejce Service Broker dla każdego zaktualizowanego wiersza. Napisz procedurę przechowywaną, która przetwarza komunikaty poza kolejką. Ustaw procedurę składowaną jako procedurę składowania aktywacji dla kolejki.

Powiązane problemy