【发布时间】: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 是否在MySecDB 或MyDB 之外的任何其他数据库中被引用以供我使用?同样,我将如何检测我的表是否在另一台服务器上被引用,例如 MyOtherSVR.anotherDBDB.dbo.spMySVR_MyDB_Staff?
我确实考虑过在每个服务器和数据库上运行查询(在循环中更改 PDO 连接字符串)并检查是否得到任何结果,但这对我来说似乎太过分了。
那么有没有办法判断一个表是否在另一个数据库/服务器中被引用?
【问题讨论】:
-
如果您有世界上所有服务器和所有数据库的列表(或至少 您的 世界),那么可以。编写所有 SQL 脚本并将其解析为对象引用。否则,这有点像问我如何才能知道在中国的人是否有我的电话号码。直到他们打电话给我,我才知道,因为在中国问每个人是不切实际的。这就是为什么应该谨慎对待链接服务器(以及一般的跨数据库访问)的原因。
标签: sql-server tsql