2017-05-04 44 views
3

我建立使用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连接字符串)查询和检查,如果我得到任何结果,但似乎过度给我。

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

+0

如果你有一个世界上所有服务器和所有数据库的列表(或至少*你的*世界),那么是的。脚本所有的SQL并解析它的对象引用。否则,这有点像问我是否可以找出中国的人是否有我的电话号码。在他们打电话给我之前,我只是不知道,因为要求中国的每个人都是不切实际的。这就是为什么应该小心处理链接服务器(以及一般的跨数据库访问)的原因。 –

回答

0

引用在同一SQL实例的其他数据库是有些容易找到 - 你可以运行类似的查询您发布针对每个实例上的其他数据库的一个,假设你在所有数据库中得到了充分的权限。

如果您没有访问所有数据库上的同一个实例,那么你就完蛋了。

除此之外,这是不现实的,充其量&不可能在最坏的情况,以确定其他服务器上的引用。这只有在你知道并且是可能引用该数据库的所有服务器的管理员时才可能。

相关问题