Comment faire pour que SQL Server 2005 appelle de manière asynchrone un fichier de commandes DOS à partir d'un déclencheur DDL?

StackOverflow https://stackoverflow.com/questions/802398

Question

J'ai créé un fichier de commandes pour exécuter SqlMetal et générer des classes de données Linq2Sql, ainsi que pour vérifier dans le contrôle de source le déclenchement d'une construction, etc. / p>

L'exécution du fichier de commandes via xp_cmdshell fonctionne correctement en dehors d'un déclencheur, comme ceci:

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

Mais lorsqu'il s'exécute en tant que déclencheur, la connexion à la base de données est toujours interrompue, ce qui entraîne l'échec de toutes les procédures DDL. Voici mon déclencheur:

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

Je cherche des conseils sur deux points:

  1. Faites ce travail. Pour une raison quelconque, il échoue toujours lorsqu'il est dans le déclencheur et ne le fait pas s'il ne l'est pas. Ne semble pas être lié à la sécurité car il fonctionne comme LocalSystem dans les deux cas.
  2. Faites en sorte que cela se produise de manière synchrone afin que les échecs et les délais d'attente dans SqlMetal ne provoquent pas l'échec de la mise à jour DDL. J'ai essayé d'envelopper le fichier de commandes avec un autre fichier et un "start cmd.exe / c otherbatch.bat", mais lors de l'exécution via le serveur SQL, il semble ignorer le début (fonctionne correctement sous DOS). Je pourrais certainement écrire un processus de sondage pour examiner certains événements de table et de collecte, mais je préférerais que ce soit basé sur un déclencheur pour le rendre moins complexe (ou suis-je en train de faire le contraire :)).
Était-ce utile?

La solution

Votre lot est probablement bloqué car il tente d'interroger des données sur les tables en cours de création, mais elles sont toujours verrouillées dans une transaction (le déclencheur fait partie de la transaction implicite que SQL Server démarre pour toute instruction DDL / DML), ne se terminera qu'après la fin du déclenchement.   Le seul " presque " moyen pratique d’exécution asynchrone dans SQL Server 2005 ou supérieur que je connaisse est Service Broker. Recherchez "Activation interne Service Broker".   En pratique, il est un peu complexe de le configurer correctement. Vous pouvez donc choisir l’option de mise en commun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top