【问题标题】:Is there a way to tell if a table is being referenced in another Database/Server?有没有办法判断一个表是否在另一个数据库/服务器中被引用?
【发布时间】:2017-05-04 02:18:06
【问题描述】:

我正在使用 PDO 中的MSSQL 驱动程序构建一个个人使用 PHP 脚本(因此,没有计划让除我以外的任何人使用它)当提供表名时,将返回引用它的所有对象

使用MySVR.MyDB.dbo.Staff 作为我的表我首先从这个查询开始

SELECT
    referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
    referencing_object_name = o.name,
    referencing_object_type_desc = o.type_desc,
    referenced_schema_name,
    referenced_object_name = referenced_entity_name,
    referenced_object_type_desc = o1.type_desc,
    referenced_server_name, referenced_database_name    
FROM
    sys.sql_expression_dependencies sed
INNER JOIN
    sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
    sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
    referenced_entity_name = 'Staff'
    AND referenced_server_name IS NULL
    AND referenced_database_name IS NULL
ORDER BY
    o.name

列出了MyDB 上所有引用我的员工表的对象

我知道我的Staff 表在存储过程中的另一个数据库MySVR.MySecDB.dbo.spMyDB_Staff 上使用。为了确认这一点,我更改了 PDO 连接字符串并重新运行查询,但使用 referenced_database_name = 'MyDB' 以确保我只得到引用 MySVR.MyDB.dbo.Staff 而不是 MySVR.MySecDB.dbo.Staff 的结果。

但问题是我如何检测Staff 是否在MySecDBMyDB 之外的任何其他数据库中被引用以供我使用?同样,我将如何检测我的表是否在另一台服务器上被引用,例如 MyOtherSVR.anotherDBDB.dbo.spMySVR_MyDB_Staff

我确实考虑过在每个服务器和数据库上运行查询(在循环中更改 PDO 连接字符串)并检查是否得到任何结果,但这对我来说似乎太过分了。

那么有没有办法判断一个表是否在另一个数据库/服务器中被引用?

【问题讨论】:

  • 如果您有世界上所有服务器和所有数据库的列表(或至少 您的 世界),那么可以。编写所有 SQL 脚本并将其解析为对象引用。否则,这有点像问我如何才能知道在中国的人是否有我的电话号码。直到他们打电话给我,我才知道,因为在中国问每个人是不切实际的。这就是为什么应该谨慎对待链接服务器(以及一般的跨数据库访问)的原因。

标签: sql-server tsql


【解决方案1】:

在同一 SQL 实例上的其他数据库中的引用很容易找到 - 您可以运行与您针对该实例上的其他每个数据库发布的查询类似的查询,假设您在所有数据库中都拥有足够的权限。

如果您无法访问同一实例上的所有数据库,那么您将陷入困境。

除此之外,在其他服务器上识别引用是不切实际的,最坏的情况是不可能的。这只有在你们都知道并且是所有可能引用此数据库的服务器的管理员时才有可能。

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2012-04-17
    相关资源
    最近更新 更多