Posts mit dem Label SQL Server werden angezeigt. Alle Posts anzeigen
Posts mit dem Label SQL Server werden angezeigt. Alle Posts anzeigen

Mittwoch, 3. März 2010

BizTalk 2006 BAM EventBus Service Error Event

Fehlermeldung im BizTalk Application Event Log:

Event Type: Error
Event Source: BAM EventBus Service
Event Category: None
Event ID: 25
Date: 3/1/2010
Time: 6:44:58 PM
User: N/A
Computer: BES086.comlineag.cl.local
Description:
Either another TDDS is processing the same data or there is an orphaned session in SQL server holding TDDS lock.Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. SQLServer: BES082, Database: BizTalkDTADb.


Das Problem mit Lösungsvorschlägen ist beschrieben unter
http://support.microsoft.com/kb/841334 (Error Description dazu beachten)

In meinem Fall war die Lösung zu verwaisten Sessions angebracht:
http://msdn.microsoft.com/en-us/library/aa275788(SQL.80).aspx

Die Kurzfassung zur Lösung:

mit der Management Konsole sich auf die BizTalk SQL DB verbinden und exec sp_who als Query ausführen. Das listet die gegenwärtig Session mit ihrem jeweiligen Status und der jeweiligen spid auf. Die 'sa' Sessions interessieren nicht, alle anderen Sessions (bis auf die eigene) kann man dann gegebenenfalls mit dem kill Befehl abschießen (kill <spid>)
Dabei sollte natürlich sichergestellt sein, das der BizTalk in der Zeit nicht auf das System zugreift, bzw. ein anderer User Remote auf dem System arbeitet ;)

Freitag, 4. April 2008

Mit dotNet drucken... ein Erfahrungsbericht

Das Drucken einer Datei mit dotNet ist eigentlich keine all zu große Herausforderung. Beispiele findet man wie Sand am Meer, der eigentliche Code ist auch nicht all zu komplex.
Entsprechend schnell hat die Methodik auch funktioniert, als sie lokal in einem UnitTest aufgerufen wurde. Gedruckt wurde dabei auf einen Netzwerkdrucker. Der gleiche Code sollte aber nun als Assembly im SQL Server 2005 abgelegt werden, so dass im Prinzip nur eine Stored Procedure aufgerufen werden muss, um - in diesem speziellen Fall - einen bestimmten Report aus den Reporting Services zu drucken. Und was kommt wohl jetzt? Richtig, es hat nicht funktioniert.
Nach mehreren erfolglosen Versuchen, die Druckfunktion für den Druck auf einem Netzwerkdrucker zu realisieren, kam dann die Idee, den Drucker direkt via USB mit der Entwicklungs-VM zu verbinden. Nach Tagen des Misserfolgs dann die Überraschung: auf einem lokalen Drucker wird der Report ausgegeben.

Meine Vermutung geht zur Zeit dahin, dass dem Aufruf für einen Netzwerkdrucker noch der zu verwendende Port angegeben werden muss. Beim UnitTest muss dies nicht geschehen, weil der Aufruf hier direkt aus Windows kommt. Wird jedoch die SP aus dem SQL Server aufgerufen, kommt der Aufruf für das unterliegende OS aus dem Web, was offensichtlich einen Unterschied macht.
Diese Vermutung muss noch durch ein wenig Research und Trial and Error verifiziert werden, doch bin ich zuversichtlich, der korrekten Lösung auf der Spur zu sein.

Sobald ich genaueres weiß, seid ihr die Ersten, die es erfahren.

EDIT: Des Rätsels Lösung ist gefunden!
Anders, als ich es vermutet habe, ging die Lösung doch, wie von Tropensturm vermutet, in Richtung Benutzer-Authentifizierung.
Da die Assembly im SQL Server aufgerufen wird, greift sie auch mit dessen Rechten auf das Netzwerk zu. Offenbar besteht hier allerdings nicht das Recht, auf Netzwerkdrucker zuzugreifen. Deshalb holen wir uns die Rechte des aktuell angemeldeten Windows-Benutzers. Das geschieht folgendermaßen.

   1:  // Vorbereitung
   2:  System.Security.Principal.WindowsIdentity clientId = null;
   3:  System.Security.Principal.WindowsImpersonationContext impersonatedUser = null;
   4:   
   5:  // Windows-Identität ermitteln
   6:  clientId = SqlContext.WindowsIdentity;
   7:   
   8:  try
   9:  {
  10:      // Windows-Berechtigungen holen
  11:      impersonatedUser = clientId.Impersonate();
  12:   
  13:      // An dieser Stelle drucken
  14:  }
  15:  finally
  16:  {
  17:      if(impersonatedUser != null)
  18:      {
  19:          // Windows-Rechte wieder abgeben
  20:          impersonatedUser.Undo();
  21:      }
  22:  }

Und kaum macht man es richtig, funktioniert es... ;)

Donnerstag, 3. April 2008

BizTalk Deployment Probleme

Wer kennts nicht als BizTalk Entwickler? Kaum wird das Projekt mal ein bischen Komplex hakts mit dem Undeployen. Irgendwo in den untiefen des ewigen Internets hab ich dann eine effektive Lösung gefunden.

Some items in the removed assembly are still being used by items not defined in the same assembly, thus removal of the assembly failed. Make sure that items in the assembly you are trying to remove fulfill the following conditions: 1. Pipelines, maps, and schemas are not being used by Send Ports or Receive Locations 2. Roles have no enlisted parties. ... Undeployment failed.

Anstatt ewig zu versuchen, was denn nun blockieren könnte und alles einzeln durchzuprobieren, gibt es einen "Trick"(?) mit der SQL Datenbank, um herauszufinden welche sogenannten Referenzen uns in die Suppe spucken (wobei sich mir durchaus die Frage stellt wieso BizTalk nicht einfach das Ergebnis dieses Selects selber anzeigen kann).

SQL Datenbank... ja aber welche?
Das kann man einfach in der Registry nachsehen unter:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\BizTalk Server\3.0\Administration\MgmtDbServer

Dann den SQL Query Analyzer öffnen mit der Verbindung auf unsere gefundene Datenbank und folgenden großen SELECT absetzen:

   1:  select
   2:  'RcvPort' PortType,
   3:  r.nvcName Port,
   4:  item.name MapName,
   5:  assem.nvcName Assembly,
   6:  nSequence, indoc_docspec_name, outdoc_docspec_name
   7:  from bts_receiveport_transform rt
   8:  inner join bts_receiveport r
   9:  on rt.nReceivePortID = r.nID
  10:  inner join bt_mapspec ms
  11:  on ms.id = rt.uidTransformGUID
  12:  inner join bts_assembly assem
  13:  on ms.assemblyid = assem.nID
  14:  inner join bts_item item
  15:  on ms.itemid = item.id
  16:  --order by Port, nSequence
  17:   
  18:  union
  19:   
  20:  select
  21:  'SendPort' PortType,
  22:  r.nvcName Port,
  23:  item.name MapName,
  24:  assem.nvcName Assembly,
  25:  nSequence, indoc_docspec_name, outdoc_docspec_name
  26:  from bts_sendport_transform rt
  27:  inner join bts_sendport r
  28:  on rt.nSendPortID = r.nID
  29:  inner join bt_mapspec ms
  30:  on ms.id = rt.uidTransformGUID
  31:  inner join bts_assembly assem
  32:  on ms.assemblyid = assem.nID
  33:  inner join bts_item item
  34:  on ms.itemid = item.id
  35:   
  36:  order by PortType, Port, nSequence

Der Result Set ist eine Liste mit noch referenzierenden Objekten.

Integration von CLR in den SQL Server

Der Link der Links, wenn es darum geht, wie man CLR in den SQL Server integriert.
Alles, was man wissen muss, anschaulich und einfach dargelegt.

Ich wünschte, ich hätte den Link gefunden, bevor ich das alles selbst herausgefunden habe...

SQL Server DBA Guide to SQLCLR