如何识别 SQL Server 中的跨数据库查询

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 文本进行静态分析,我当前的计划要求记录缓存的查询文本并对它们进行静态分析。

这种方法有什么替代方法吗?即:使用扩展事件/跟踪/审计?

spa*_*dba 5

我会设置一个扩展事件会话来捕获锁定获取的事件并使用 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使用offsetStartoffsetEndfrom 从操作中提取语句tsql_frame

在此处输入图片说明

我的博客上有一个类似的例子:https : //spaghettidba.com/2015/04/20/tracking-table-usage-and-identifying-unused-objects/