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

Sql server 有没有办法判断一个表是否在另一个数据库/服务器中被引用?,sql-server,tsql,Sql Server,Tsql,我正在使用PDO中的MSSQL驱动程序构建一个personal usePHP脚本(因此,没有计划让除我以外的任何人使用它),当提供表名时,它将返回引用它的所有对象 使用MySVR.MyDB.dbo.Staff作为我的表,我首先从这个查询开始 SELECT referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID), referencing_object_name = o.name, referencing_object_type_

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

使用
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上引用MyStaff表的所有对象

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

但是问题是,我如何检测
MySecDB
MyDB
之外的任何其他数据库中是否引用了
Staff
,以便我执行此操作?同样,我如何检测我的表是否在另一台服务器上被引用,如
MyOtherSVR.anotherDBDB.dbo.spMySVR\u MyDB\u Staff

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


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

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

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


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

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