Сервер SQL — Как распечатать текущий запрос SQL в PHP с sqlsrv?

Я хочу регистрировать запросы SQL (особенно INSERT, UPDATE и DELETE), чтобы импортировать эти изменения БД в ту же БД на другом сервере.
Я использую PHP и SQLSRV для выполнения моих запросов следующим образом:

$query = "UPDATE table SET column = 0 WHERE id = (?)";
$params = array($myid);
sqlsrv_query($conn, $query, $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)

Но нет никаких параметров …
Есть ли способ получить полный SQL-запрос, включая параметры?

В противном случае я думаю, что мне нужно изменить все мои запросы в PHP и не использовать параметр $ params в sqlsrv_query ().

Благодарю.

2

Решение

Вы можете написать второй запрос, который принимает в качестве параметра предыдущую строку запроса:

$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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]