2014-10-22 95 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