短いバージョン: sqlsrv ドライバー (ネイティブ クライアント ラッパー) は、トリガーから生成された制約違反エラーを「処理」します。mssql ドライバー ( ntwdlibラッパー) は、問題なく報告します。
- SQL Server 2005
- PHP 5.3.1
- PHP 1.1 用の SQL Server ドライバー
備品:
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 を実行すると、収益が得られます
(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!
sqlsrv_query で実行してもエラーは報告されません。
$conn = sqlsrv_connect(...);
var_dump(sqlsrv_query($conn, 'INSERT INTO v SELECT CURRENT_TIMESTAMP'));
var_dump(sqlsrv_errors());
出力
resource(11) of type (SQL Server Statement)
NULL
アプリケーションには、後のステートメントが失敗する以外に、トリガーが失敗したことを確認する方法がありません (らしい)。
質問:どうしたの? この PHP ドライバーを使用しますか? DML トリガーでビューを使用していますか? ドライバーは運命の取引を報告しますか?
edit 2010-02-17 11:50 : 質問の最初のバージョンでは、単純なINSERT
. これは、制約に違反する DML がTRY
ブロック内にある場合にのみ発生します。混乱させて申し訳ありません。
2010-03-03 を編集: の重大度レベルに執着しすぎないようにRAISERROR
、実際のコードは と でキャッチされたエラーを再スローしようとERROR_NUMBER
しERROR_SEVERITY
ますERROR_STATE
。
さらに、以下の質問に注意してください。
質問:どうしたの? この PHP ドライバーを使用しますか? DML トリガーでビューを使用していますか? ドライバーは運命の取引を報告しますか?
ここに記載されている状況を直接経験せずに賞金を収穫しようとしないでください.