SQL Server 2005, PHP v1.1 için SQL Sürücüsü "tetikleyici mahkum İşlem" yiyor

3 Cevap php

Kısa versiyon: sqlsrv sürücü (Native Client sarıcı) tetikler oluşturulan kısıtlama ihlali hataları "yiyor"; mssql sürücüsü (ntwdlib sarıcı) onları sadece iyi bildiriyor.

  • SQL Server 2005
  • PHP 5.3.1
  • PHP 1.1 için SQL Server sürücüsü

fikstür:

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;

INSERT INTO v SELECT CURRENT_TIMESTAMP; Management Studio verimleri geçiyor

(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!

Ben sqlsrv_query aracılığıyla çalıştırdığınızda no hata bildirilir:

$conn = sqlsrv_connect(...);
var_dump(sqlsrv_query($conn, 'INSERT INTO v SELECT CURRENT_TIMESTAMP'));
var_dump(sqlsrv_errors());

çıkışlar

resource(11) of type (SQL Server Statement)
NULL

Uygulama (öyle görünüyor) tetik başarısız sonra ifadeleri aracılığıyla başka başarısız olduğunu öğrenmek için bir yol vardır.

Soru: What's up? Bu PHP sürücüyü kullanıyor musunuz? Eğer DML tetikleyiciler ile görüşlerini kullanıyor musunuz? Mu sürücü raporu doomed transactions?

edit 2010-02-17 11:50: Sorunun ilk sürümü yanlış Ben basit bir INSERT içeren tetikleyici ile objeyi gördüğünü iddia etti. kısıt ihlal DML TRY bloğunun içinde olduğu zaman iyi, o sadece olur. Karışıklık için özür dilerim.

edit 2010-03-03: sadece böylece siz de (RAISERROR, gerçek kod {[ile yakaladı hatayı rethrow çalışır içinde şiddeti seviyesine bağlı alamadım 2)]}, ERROR_SEVERITY ve ERROR_STATE.

ayrıca, sorulan sorulara dikkat ediniz:

Soru: What's up? Bu PHP sürücüyü kullanıyor musunuz? Eğer DML tetikleyiciler ile görüşlerini kullanıyor musunuz? Mu sürücü raporu doomed transactions?

Burada anlatılan durum ile birinci elden deneyime sahip olmadan lütuf hasat kalkmayın lütfen.

3 Cevap

Ben geçmişte bu sorun haline çalıştırmak, sadece bu karışıklık PHP değildir. Nedense, ben anlamaya ve herhangi bir belgelerine bulamıyorum ki, sen olmayan sistem yöneticileri için 18 bu kadar max şiddetini belirtmek gerekir. Bu deneyin:

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!', 18, 0);
END CATCH
END;

note: sadece yukarıdaki örnekteki 17-18 şiddetini değişti.

17 Bir Önem Düzeyi "Yetersiz kaynaklar" gösterir. Yerine 16 kullanmayı deneyin. (Error Message Severity Levels)

Kanonik referanstan: Error Handling in SQL 2000 – a Background

Severity level – a number from 0 to 25. The stort story is that if the severity level is in the range 0-10, the message is informational or a warning, and not an error. Errors resulting from programming errors in your SQL code have a severity level in the range 11-16. Severity levels 17-25 indicate resource problems, hardware problems or internal problems in SQL Server, and if the severity is 20 or higher, the connection is terminated. For the long story, see the section More on Severity Levels for some interesting tidbits. For system messages you can find the severity level in master..sysmessages, but for some messages SQL Server employs a different severity level than what's in sysmessages.

Ayrıca bakınız: Error Handling in SQL 2005 and Later

Eğer 10 ya da altında bir önem denediniz mi? Arada hep SQL Sürücü ve PHP ile iyi bir şans oldu. Bu işe yaramazsa, 2005 ve 2008., Emin bu sunucu geneli değil yapmak için farklı bir sunucu deneyin.