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

标签 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

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

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

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

最佳答案

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

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

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

关于sql-server - 有没有办法判断一个表是否在另一个数据库/服务器中被引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43772771/

相关文章:

Java JDBC : dates consistently two days off

SQL Server - 使用 SQL 删除日期范围之间的行。日期转换失败

sql - 使用 2 个以上表的 UNION 覆盖按字母顺序排列的默认 ORDER BY?

sql - 修剪空白而不影响内部空白

sql-server - T-SQL 是否有用于连接字符串的聚合函数?

sql - 从表值函数返回表并在临时表中设置该值

sql-server - SQL 服务器 : clustered index slow

sql - 在sql server中按字符串对列进行排序?

c#.net 错误 : There is already an open DataReader associated with this Command which must be closed first

sql-server - 获取每个不同列值的前 5 个