Я хочу регистрировать запросы 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 ().
Благодарю.
Вы можете написать второй запрос, который принимает в качестве параметра предыдущую строку запроса:
$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-инъекций), поэтому я предлагаю не отказываться от использования параметров, если вы не уверены, что запросы будут полностью безопасными.
Других решений пока нет …