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

时间:2017-05-04 02:18:06

标签: sql-server tsql

我正在使用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的结果。

问题是我如何检测StaffMySecDB以外的任何其他数据库中是否引用MyDB供我使用?同样,我如何检测我的表是否在MyOtherSVR.anotherDBDB.dbo.spMySVR_MyDB_Staff中的其他服务器上被引用?

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

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

1 个答案:

答案 0 :(得分:0)

同一个SQL实例上的其他数据库中的引用有点容易找到 - 您可以针对实例上的每个其他数据库发布的类似查询,假设您已获得足够的权限数据库。

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

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