2014-10-22 91 views
2

我想記錄SQL查詢(特別是INSERT,UPDATE和DELETE),將這些數據庫更改導入到另一臺服務器上的同一個數據庫。 我使用PHP和SQLSRV如下執行我的查詢:如何使用sqlsrv打印出php中的當前sql查詢?

$query = "UPDATE table SET column = 0 WHERE id = (?)"; 
$params = array($myid); 
sqlsrv_query($conn, $query, $params); 

現在我想保存完整的SQL查詢(包括PARAMS)到日誌表。我希望我可以用觸發器做到這一點,並嘗試類似以下內容:

SELECT dest.text 
FROM sys.dm_exec_requests dem CROSS APPLY sys.dm_exec_sql_text(dem.sql_handle) dest 
WHERE session_id = @@SPID 

但是,這總是會自行返回。 以下似乎更好:

DECLARE @sql nvarchar(max) 
SET @sql = 'DBCC INPUTBUFFER(' + CAST(@@SPID AS nvarchar(100)) + ')' 
CREATE TABLE #SQL (
    EventType varchar(100), 
    Parameters int, 
    EventInfo nvarchar(max) 
) 
INSERT INTO #SQL 
EXEC sp_executesql @sql 
SELECT @sql = EventInfo FROM #SQL 
DROP TABLE #SQL 

之後,@sql包含有類似

(@P1 int)UPDATE table SET column = 0 WHERE id = (@P1) 

但沒有參數... 有沒有什麼辦法讓完整的SQL查詢,包括參數?

否則我想我必須改變我所有的查詢在PHP中,不要使用sqlsrv_query()的'$ params'參數。

謝謝。

回答

0

你可以寫一個第二個查詢,這需要以前的查詢字符串作爲參數:

$query = "UPDATE table SET column = 0 WHERE id = (?)"; 
$fullQuery = "UPDATE table SET column = 0 WHERE id = ($myid)"; 

又通$fullQuery作爲參數傳遞給另一個查詢:

... 
$sampleQuery = "INSERT INTO logTable (Query) VALUES (?)"; 
$sampleParams = array($fullQuery); 

sqlsrv_query($conn, $sampleQuery, $sampleParams); 
... 

我想你知道爲什麼參數查詢被使用(避免SQL注入),所以如果你不確定查詢是否完全安全,我建議不要放棄使用參數。

+0

這正是我現在正在做的事情(帶有一點記錄功能)。我仍然希望有一個更簡單的方法,因爲現在我必須自己完成不同數據類型的轉換(int,string,DateTimes等),並且必須更改每個受影響的SQL查詢以使用我自己的函數而不是sqlsrv_query()。 – Robert 2014-10-24 15:23:16