如何查询Microsoft SQL Azure中SQL表结构的修改者及时间
查询Azure SQL表结构修改的操作人与时间
你当前使用的sys.dm_db_index_usage_stats只能记录表的最后更新时间,无法捕获DDL(修改列数据类型属于DDL操作)的执行人和具体操作信息,以下是可行的解决方案:
1. 利用Azure SQL审计日志(推荐)
如果你的数据库已经开启了Azure SQL数据库审计(通过Azure门户或T-SQL配置),可以通过审计日志查询操作人、时间和执行语句:
SELECT event_time AS 操作时间, session_server_principal_name AS 操作人, statement AS 执行的DDL语句 FROM sys.fn_get_audit_file('https://<你的存储账户名>.blob.core.windows.net/sqldbauditlogs/<你的服务器名>/<TestDB>/', DEFAULT, DEFAULT) WHERE action_id = 'AL' -- ALTER TABLE操作对应的action_id AND target_object_name = 'TestTbl' AND database_name = 'TestDB'
注意:替换URL中的占位符为实际存储账户、服务器名称信息。
2. 通过扩展事件查询
如果之前创建了追踪DDL操作的扩展事件会话,可以查询事件文件获取信息:
SELECT event_data.value('(event/@timestamp)[1]', 'datetime') AS 操作时间, event_data.value('(event/data[@name="username"]/value)[1]', 'nvarchar(100)') AS 操作人, event_data.value('(event/data[@name="statement"]/value)[1]', 'nvarchar(max)') AS 执行语句 FROM (SELECT CONVERT(xml, event_data) AS event_data FROM sys.fn_xe_file_target_read_file('<你的扩展事件文件路径>*.xel', NULL, NULL, NULL)) AS x WHERE event_data.value('(event/data[@name="object_name"]/value)[1]', 'nvarchar(100)') = 'TestTbl'
3. 无提前配置时的补救方案
如果既没有开启审计也没有配置扩展事件,事后很难直接获取操作人:
- 可以查看
sys.tables的modify_date确认修改时间,但无法获取操作人:SELECT name AS 表名, modify_date AS 最后修改时间 FROM sys.tables WHERE name = 'TestTbl' AND database_id = DB_ID('TestDB') - 若修改操作是通过Azure门户、ARM模板等方式触发的,可以在Azure活动日志中搜索对应时间的数据库操作,查看操作人;但直接执行SQL语句修改的情况不会记录在活动日志中。
- 解析事务日志(
sys.dm_db_log_info)可以找到ALTER TABLE相关事务的时间,但无法直接关联操作人,且解析难度高:SELECT [Begin Time] AS 事务开始时间, Operation, [Transaction ID] FROM sys.dm_db_log_info(DB_ID('TestDB')) WHERE Operation LIKE '%ALTER_TABLE%'
总结:提前配置审计或扩展事件是捕获DDL操作信息的最佳方式,未提前配置的话,事后获取操作人存在局限性。
内容的提问来源于stack exchange,提问作者JOakland2021
相关产品推荐
相关产品推荐

