Frage

Ich habe eine Batch-Datei SqlMetal laufen und Linq2Sql Datenklassen, überprüfen Sie in der Quellcodeverwaltung Auslösen eines zu bauen, etc erzeugen ... Ich möchte dieses Skript laufen zu jeder Zeit haben, eine DDL Änderung in SQL Server 2005

Ausführen des Batchdatei über xp_cmdshell funktioniert außerhalb eines Triggers, wie folgt aus:

exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

Aber wenn es läuft als Auslöser, es immer mal in die Datenbank heraus verbindet, so dass alle DDL zum Scheitern verurteilt. Hier ist mein Trigger:

CREATE TRIGGER [Trig_SqlMetal]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

Ich suche Rat auf zwei Punkte:

  1. Machen Sie diese Arbeit. Aus irgendeinem Grunde versagt es immer dann, wenn in dem Trigger, und nicht, wenn sie nicht in einem Trigger. Erscheint nicht sicherheitsrelevante, da es als Localsystem läuft in beiden Fällen.
  2. Machen Sie diese Asychronously passieren, so dass Ausfälle und Timeouts in SqlMetal nicht DDL-Update Fehler verursachen. Ich habe versucht, die Batch-Datei mit einem anderen Verpackung und einem „Start cmd.exe / c otherbatch.bat“, aber wenn durch SQL-Server ausgeführt scheint es, um den Start zu ignorieren (funktioniert gut von DOS). Ich könnte sicherlich einen Abfrageprozess schreibt an einigen Tisch und Pickup-Ereignisse zu suchen, aber ich würde diese seinen Trigger bevorzuge Grundlage es komplex macht weniger (oder mache ich das Gegenteil :)).
War es hilfreich?

Lösung

Ihre Batch wahrscheinlich blockiert wird, weil es versucht, Daten über die Tabellen zur Abfrage erstellt werden, aber sie sind immer noch in einer Transaktion (der Abzug ist Teil des impliziten Transaktions SQL Servers startet für jede DDL / DML-Anweisung) gesperrt ist, dass wird abgeschlossen erst nach dem Abzug beendet.   Die einzige „fast“ praktische Art und Weise der asynchronen Ausführung in SQL Server 2005 oder höher, die ich kenne ist Service Broker. Geben Sie für „Service Broker Interne Aktivierung“.   In der Praxis ist es ein wenig komplex, es richtig zu setzen, so dass Sie auch für die Zusammenlegung Option gehen könnten wählen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top