jvi*_*ich 5 trigger sql-server sql-server-2008-r2
使用 SQL Server,是否存在一种从触发器内部审计触发它的 sql 的方法?
我需要知道在没有分析器的情况下通过数据库触发触发器的 SQL 查询。
谢谢
我有许多触发器可以做到这一点,我发现这DBCC INPUTBUFFER
通常是最好的方法。注意:输出限制为 4000 个字符。很长的查询将被截断。
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
Run Code Online (Sandbox Code Playgroud)
最后,@sql
包含对当前请求的查询。此外,您可以轻松地使用表变量而不是临时表。
以下似乎可以实现检索当前批次/语句的技巧:
SELECT current_batch = dest.text
, current_statement = SUBSTRING(dest.text, dem.statement_start_offset/2, CASE WHEN dem.statement_end_offset=-1 THEN 8000 ELSE (dem.statement_end_offset-dem.statement_start_offset)/2 END)
FROM sys.dm_exec_requests dem CROSS APPLY sys.dm_exec_sql_text(dem.sql_handle) dest
WHERE session_id = @@SPID
Run Code Online (Sandbox Code Playgroud)
通过 IIRC,如果调用是存储过程,您可能会获得返回的过程的代码,而不是调用的文本,具体取决于请求的提交方式(即席 SQL、准备好的过程调用等)。我不确定在触发器中您是否最终会获得触发器的代码而不是您正在寻找的代码,因此您需要对其进行测试。
要查看批处理和语句之间的区别,请运行以下命令:
DECLARE @current_batch NVARCHAR(MAX), @current_statement NVARCHAR(MAX)
-- start of statement that will be returned by itself
SELECT @current_batch = dest.text
, @current_statement = SUBSTRING(dest.text, dem.statement_start_offset/2, CASE WHEN dem.statement_end_offset=-1 THEN 8000 ELSE (dem.statement_end_offset-dem.statement_start_offset)/2 END)
FROM sys.dm_exec_requests dem CROSS APPLY sys.dm_exec_sql_text(dem.sql_handle) dest
WHERE session_id = @@SPID
-- end of statement that will be returned by itself
-- results:
PRINT '---- BATCH --------------------------------------------'
PRINT @current_batch
PRINT '---- STATEMENT ----------------------------------------'
PRINT @current_statement
Run Code Online (Sandbox Code Playgroud)
通过 SQL Server Management Studio 或类似工具。
归档时间: |
|
查看次数: |
10509 次 |
最近记录: |