SQL-Server-Problem: Incorrect Syntax '44446'

Der Dotnet-Doktor  –  0 Kommentare

Die vom Upzising-Wizard des SQL Server erzeugten Trigger sind nicht kompatibel mit SQL Server 2012 und 2014.

Die Betriebsruhe bei einem Kunden zwischen den Feiertage nutzte ich, um einige Server eines Kunden auf den neusten Stand zu bringen. Der SQL Server hielt dabei eine böse Überraschung für mich. Nach einem Upgrade eines Datenbankservers des SQL Server 2008 auf den SQL Server 2014 verweigerten einige (aber nicht alle) Datenbanktabellen jeglichen Schreibzugriff mit der Fehlermeldung: Incorrect Syntax near '44446'. Das Problem konnte ich auf einem anderen System reproduzieren.

Die Ursachenforschung ergab, dass es für die betroffenen Datenbanktabellen einen Trigger gab, in dem unter anderem dies stand:

    BEGIN
RAISERROR 44447 'Der Datensatz kann nicht hinzugefügt oder
geändert werden. Aufgrund der Regeln für die referenzielle Integrität
ist in der Tabelle ''xyz'' ein verknüpfter (verwandter) Datensatz
erforderlich.'
...
END

Diese Syntax für die Verwendung von Raiserror wird seit SQL Server Version 2012 nicht mehr unterstützt. Die Syntax ist nun:

RAISERROR ( { msg_id | msg_str | @local_variable }     
{ ,severity ,state } [ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

Es muss also nun zum Beispiel so heißen:

RAISERROR ('44446 Der Datensatz kann nicht hinzugefügt oder 
geändert werden. Aufgrund der Regeln für die referenzielle
Integrität ist in der Tabelle 'xyz'' ein verknüpfter (verwandter)
Datensatz erforderlich.',16,1)

Im Web habe ich dann noch den Hinweis gefunden: "SQL 2012 does not support the undocumented version of Raiserror".

OK, wenn also die alte Syntax undokumentiert war, stellt sich die Frage: Welcher Entwickler hat das gemacht?

Es war aber kein Entwickler beim Kunden. Es waren Entwickler bei Microsoft selbst, denn der Trigger wurde nicht manuell angelegt, sondern vor einigen Jahren von dem "Microsoft SQL Server Upzising Wizard" aus einer Microsoft-Access-Datenbank generiert. Also Vorsicht beim Upgrade von Datenbanken, die mit diesem Assistenten bestückt wurde.