Trigger na serwerze 1 - uruchamia job na 2 serwerze

Trigger na serwerze 1 - uruchamia job na 2 serwerze
BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
0

Witam,

walczę z tematem i coś nie mogę dojść do brzegu. Generalnie geneza "problemu" jest taka, że chcemy aby na 1 serwerze (SQL Server 2014) gdy zostaną wprowadzone nowe wartości do tabeli - został uruchomiony job na drugim serwerze (także SQL Server 2014). Serwery podłączone ze sobą przez "Linked Servers".

Na serwerze 1 stworzyłem Trigger:

Kopiuj
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

 CREATE TRIGGER [dbo].[tr_Test] ON [dbo].[Xrate]
    AFTER INSERT
    AS
    BEGIN
	EXEC [CDWSVR03].msdb..sp_start_job
        @job_name = 'TriggerTest2';

    END

GO

Na serwerze 2 stworzyłem job "TriggerTest2" - ot prosty przykład który wprowadza jakieś dane do tabeli.
I teraz tak serwery się "widzą" i mogą się odpytywać ... po małych problemach i googlowaniu mogę także bezpośrednio z serwera 1 odpalić job na serwerze 2 (ustawienie RPC Out = True w właściwościach "Linked ServerS"). Niestety mogę to zrobić tylko bezpośrednio z okna " new query". Natomiast już żeby job się odpalił po przez Trigger dostaję błąd:

OLE DB provider "SQLNCLI11" for linked server "CDWSVR03" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Procedure tr_Test, Line 5
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "CDWSVR03" was unable to begin a distributed transaction.

Dodam, że na początku miałem podobny błąd tylko wtedy w 1 linii miałem:

OLE DB provider "SQLNCLI11" for linked server "CDWSVR03" returned message "CDWSVR03" was unable to begin a distributed transaction."

Ale szukając rozwiązania natrafiłem na artykuł: https://www.virtualizationhowto.com/2015/04/ole-db-provider-sqlncli11-linked-server-unable-distributed-transaction/

Wydaje mi się, że zastosowałem się do wytycznych i ostatecznie błąd zmienił na ten zacytowany jako pierwszy: "..returned message "No transaction is active."."
Nie wiem jak z tym ruszyć dalej :| Podpowiedzcie proszę co tu robić dalej :)

Z góry dzięki,
BB

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 minuty
  • Postów:2367
0

Załóżmy, że zrobiłeś to rozwiązanie.

  1. Wstawiasz wiersz, odpala się JOB
  2. Robisz rollback transakcji (albo serwer robi jak poleci jakiś błąd).

Jak zrobisz rollback JOBa na zdalnym serwerze? :-)

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
0

Nie zakładam takiej sytuacji ;) ... Generalnie plan jest taki, że system ERP ładuje sobie plik z danymi wbudowanymi skryptami i na koniec operacji wstawia np date do tabeli LOG (robione przez kogoś innego). Ja odpowiadam za to by wykonać operacje jak "odświeżenie" tabeli i przeliczenie wyników po tym gdy pojawi się nowy wpis w tabeli LOG na serwerze 1.
Zakładam, że jeśli coś pójdzie nie tak to nie zostanie wprowadzony nowy wpis do tabeli LOG w ogóle ...

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 minuty
  • Postów:2367
1

Spróbuj zatem to wywołanie joba opakować w transakcję atutonomiczną.

Widzę jeszcze jedną rzecz do przemyślenia. Odpalając joba w triggerze przyblokujesz sesję, która wstawia dane do LOGA. Może to ma dla Ciebie znaczenie, może nie.
Nie wiem czy np. drugie wstawienia do LOGa zanim Twój Job zakończy pracę nie będzie problematyczn (będziesz miał 2 joby równolegle).

Rozważałeś coś innego? Np. Trigger wstaia wiadomość do kolejki, a kolejka ma skojarzoną procedurę (np. wywołanie tego joba) + max. ilość wątków?
Jeśli się nie mylę, kolejka powinna być obsługiwana asynchronicznie i sesja wstawiająca do loga nie będzie blokowana.

BlackBad
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 miesiące
  • Postów:454
0

Ok .. doczytuje/dokształcam się teraz na temat "transakcji autonomicznej" i będę próbował. (ewentualnie jakieś przykłady / rozwiązania do mojej konkretnej sytuacji mile widziane )

Co do reszty: raczej nie powinno mieć znaczenia - rekord do LOGA będzie wstawiany raz dziennie po zakończeniu wcześniejszych operacji. Job zrobi swoje w ciągu kilku/kilkunastu minut.
Nie rozważałem kolejki, nie mam praktyki z tym - natomiast spróbowałem w Triggerze na serwerze 1 wywołać procedure (zamiast joba) na serwerze2 ale zwraca ten sam błąd.

Edit: Ok dzięki Tobie i podpowiedziom o "trnskacji autonomicznej" - znalazłem rozwiązanie aby w ustawieniach Linked Server zmienić "remote proc transaction promotion" na False.
Po zmianie działa jak zakładałem. Oczywiście wezmę pod uwagę także inne Twoje punkty gdy zaczniemy testy. Dzięki wielkie za pomoc!

edytowany 1x, ostatnio: BlackBad
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 3 godziny
  • Postów:3866
0

Nigdy nie robiłem tego w ten sposób, czemu to jest akurat job?

Generalnie raz miałem sytuacje, żeby dodanie czegoś w jednej tabeli generowało wykonanie akcji na drugim serwerze, ale wtedy użyłem service brokera do "gadania" między serwerami.
Jako ze było to jakiś czas temu to szczegółów implementacyjnych nie pamiętam (dostępu do baz już też nie mam) ale działało to sprawnie.

Do poczytania
https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-service-broker
https://technet.microsoft.com/en-us/library/bb839483(v=sql.105).aspx

BlackBad
W sumie wydawało mi się to najprostsze rozwiązanie (chyba też muszę po prostu przyznać, że nie znałem innych rozwiązań) - job uruchamia mi paczki SSIS które robią już co tam sobie biznes zamarzył (w naszym wypadku odświeża tablice w DW i robi wyliczenia - które są przetwarzane dalej w narzędziach raportowych zbudowanych w accessie ). Tak czy inaczej zabieram się za lekturę z linków. Dzięki!
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)