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.