2014-10-22 2 views
2

SQL 쿼리 (특히 INSERT, UPDATE 및 DELETE)를 로깅하여 이러한 DB 변경을 다른 서버의 동일한 DB로 가져 오려고합니다. 나는 다음과 같이 내 쿼리를 실행하기 위해 PHP 및 SQLSRV를 사용 sqlsrv를 사용하여 현재 SQL 쿼리를 PHP로 출력하는 방법은 무엇입니까?

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

지금 내가 로그 테이블에합니다 (PARAMS 포함) 전체 SQL 쿼리를 저장할. 나는 방아쇠로 이것을 할 수 있었으면 좋겠고 다음과 같은 것을 시도했다.

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) 

같은 것을 포함하지만 더 PARAMS이없는 ... 을 포함한 전체 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

관련 문제