version courte: le pilote sqlsrv (wrapper client natif) "mange" les erreurs de violation de contraintes générées à partir des déclencheurs; le pilote mssql (ntwdlib wrapper) les signale très bien.SQL Server 2005, Pilote SQL pour PHP v1.1 mange des erreurs de "transaction condamnée dans le déclencheur"
- SQL Server 2005
- PHP 5.3.1
- Pilote SQL Server pour PHP 1,1
appareil:
CREATE TABLE t (
t INT NOT NULL PRIMARY KEY
);
CREATE VIEW v AS
SELECT CURRENT_TIMESTAMP AS v
;
CREATE TRIGGER vt ON v
INSTEAD OF INSERT
AS BEGIN
BEGIN TRY
INSERT INTO t SELECT 1 UNION ALL SELECT 1;
END TRY
BEGIN CATCH
RAISERROR('fubar!', 17, 0);
END CATCH
END;
en cours d'exécution INSERT INTO v SELECT CURRENT_TIMESTAMP;
par Management Studio donne
(0 row(s) affected)
Msg 3616, Level 16, State 1, Line 1
Transaction doomed in trigger. Batch has been aborted.
Msg 50000, Level 17, State 0, Procedure vt, Line 8
fubar!
aucune erreur est rapporté quand je le lance à travers sqlsrv_query:
$conn = sqlsrv_connect(...);
var_dump(sqlsrv_query($conn, 'INSERT INTO v SELECT CURRENT_TIMESTAMP'));
var_dump(sqlsrv_errors());
sorties
resource(11) of type (SQL Server Statement)
NULL
l'application a (il semble) aucun moyen de savoir que le déclencheur a échoué autre que à travers les déclarations ultérieures échouant. La question: Quoi de neuf? Utilisez-vous ce pilote PHP? Utilisez-vous des vues avec des déclencheurs DML? Le pilote signale-t-il transactions condamnées?
modifier 2010-02-17 11:50: la première version de la question à tort prétendu que j'ai vu l'artefact avec la gâchette contenant un INSERT
simple. Eh bien, cela se produit uniquement lorsque le fichier DML violant les contraintes se trouve dans un bloc TRY
. Désolé pour la confusion.
modifier 2010-03-03: juste pour que vous les gars ne sont pas trop attaché au niveau de gravité dans RAISERROR
, le code réel tente de réémettre l'erreur pris avec ERROR_NUMBER
, ERROR_SEVERITY
et ERROR_STATE
.
En outre, s'il vous plaît faites attention aux questions posées:
La question: Quoi de neuf? Utilisez-vous ce pilote PHP? Utilisez-vous des vues avec des déclencheurs DML? Le pilote signale-t-il transactions condamnées?
Veuillez ne pas essayer de récolter la prime sans avoir une expérience de première main de la situation décrite ici.
Le niveau de gravité 18 est "Erreur interne non fatale détectée" - Ces messages indiquent qu'il existe un problème de logiciel interne, mais l'instruction se termine et la connexion à SQL Server est conservée. Par exemple, un message de niveau de gravité 18 se produit lorsque le processeur de requêtes SQL Server détecte une erreur interne lors de l'optimisation de la requête. L'administrateur système doit être informé chaque fois qu'un message de niveau de gravité 18 se produit. –
n'aide pas. Est-ce que * vous * voyez une différence entre 17 et 18 lorsque vous exécutez l'extrait PHP qui fait partie de la question? –