我正在尝试通过sys.sql_expression_dependencies
跟踪对象关系来为数据库构建依赖关系树(或者如果它是实现此目的的唯一方法,我可能会使用sys.dm_sql_referenced_entities
。) / p>
我注意到对于某些引用的对象,我得到referenced_entity_name
但不是referenced_schema_name
或(至关重要的)referenced_id
。查看sys.sql_expression_dependencies上的Microsoft页面,我发现这些列在&#34时可以为NULL;引用实体的模式取决于调用者的模式,并在运行时解析。&#34 ;查看引用存储过程,我发现它引用的引用对象只是MyObject
,而不是dbo.MyObject
。 (实际上所有这个数据库都在dbo模式中,因此有些人 - 包括我自己 - 有时会懒得忽略包含显式模式引用)。我尝试更改过程定义以明确引用dbo.MyObject
,然后再次查看sys.sql_expression_dependencies
,我确实看到之前遗漏的referenced_schema_name
和referenced_id
。< / p>
目前,我无法修复数据库中的所有对象,以便它们通过架构显式地进行所有引用。所以,我的问题是:Microsoft页面所说的&#34;引用实体的模式取决于调用者的模式,并在运行时解析&#34;这是否意味着SQL引擎将始终推断引用对象的架构与引用对象的架构相同?如果是这样,我可以使用MyReferencingObjectSchema
+ MyReferencedObjectSchema
查找引用对象的object_id
并继续构建我的树。还是比这更复杂?
答案 0 :(得分:1)
比这更复杂,我害怕。它还将在连接的默认模式中查找具有正确名称的对象。这就是为什么你通常不必将模式名称放入dbo中 - 这是通常的默认模式。
它查找我不知道的事情的顺序 - 默认或当前第一 - 但这应该很容易测试。