And*_*ton 8 sql-server sql-server-2008-r2
在准备迁移项目时,我们正在尝试识别任何跨数据库选择数据的查询。
这可以是以下形式:
SELECT fieldA, fieldB
FROM dbo.TableA a
JOIN DatabaseB.dbo.TableB b ON b.ID = a.ID
Run Code Online (Sandbox Code Playgroud)
或者
DECLARE @resultFromDatabaseB VARCHAR(50)
SELECT @resultFromDatabaseB = b.ID
FROM DatabaseB.dbo.TableB
SELECT fieldA, fieldB
FROM dbo.TableA a
WHERE a.ID = @resultFromDatabaseB
Run Code Online (Sandbox Code Playgroud)
或任何其他变体(包括插入/更新/等...)
不幸的是,大多数查询不是存储过程,因此我无法对 SQL 文本进行静态分析,我当前的计划要求记录缓存的查询文本并对它们进行静态分析。
这种方法有什么替代方法吗?即:使用扩展事件/跟踪/审计?
我会设置一个扩展事件会话来捕获锁定获取的事件并使用 API 流式传输事件。
首先是会议:
CREATE EVENT SESSION crossdb ON SERVER
ADD EVENT sqlserver.lock_acquired(
SET collect_database_name=(1),collect_resource_description=(1)
ACTION(
sqlserver.request_id,sqlserver.session_id,
sqlserver.sql_text,sqlserver.tsql_frame
)
WHERE (
[package0].[equal_boolean]([sqlserver].[is_system], (0)) -- user SPID
AND [package0].[equal_uint64]([resource_type], (5)) -- OBJECT
AND [package0].[not_equal_uint64]([database_id], (32767)) -- resourcedb
AND [package0].[greater_than_uint64]([database_id], (4)) -- user database
AND [package0].[greater_than_equal_int64]([object_id], (245575913)) -- user object
AND (
[mode] = (1) -- SCH-S
OR [mode] = (6) -- IS
OR [mode] = (8) -- IX
OR [mode] = (3) -- S
OR [mode] = (5) -- X
)
AND [database_name] <> N'distribution'
)
)
WITH (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=OFF
)
GO
Run Code Online (Sandbox Code Playgroud)
然后,您可以对transaction_id和上的事件进行分组tsql_frame。接触不止一个database_id的组是发布跨数据库语句的组。然后,您可以sql_text使用offsetStart和offsetEndfrom 从操作中提取语句tsql_frame。
我的博客上有一个类似的例子:https : //spaghettidba.com/2015/04/20/tracking-table-usage-and-identifying-unused-objects/
| 归档时间: |
|
| 查看次数: |
1369 次 |
| 最近记录: |