SQL Server语言 - 如何将 sys.extended_properties 中的 id 映射到对象名称



当我们对 CRUD 存储过程进行编码时,我们添加一个扩展属性,指示它们所基于的表。我希望能够询问sys.extended_properties以获取依赖于给定表的过程列表,但extended_properties持有的major_id似乎与sys.objectssys.sysobjects中的object_id不同。

我需要什么魔法联接?

从sys.extended_properties的书籍在线条目中,如果类 = 1、2 或 7,则major_id = object_id。 如果运行手动查询,则属性的类是什么? 我的猜测是以下内容将起作用:

select object_name([major_id]), [name], [value]
from sys.extended_properties

MSDN for sys.extended_properties 描述了major_id和minor_id。上下文取决于类列。

现在,major_id = 在 sys.objects 中有意义时object_id。

我以前用过这个来测试扩展属性,所以我知道它有效。

但是,在第二次阅读您的问题时,存储过程的扩展属性与过程中使用的表之间没有直接链接。如果我理解正确的话,您必须通过sys.sql_expression_dependencies进行连接

在 MSDN 中,您必须检查class字段以及major_id

如果类为 0,则major_id始终为 0。

如果类为 1、2 或 7,则major_id为 object_id。

其他类似乎没有记录,因此我不会依赖它们。 例如,类 5 似乎用于 CLR 程序集 (SqlAssemblyProjectRoot)。在我的例子中,一个这样的程序集的major_id是 65673,sys.objects中甚至没有该 ID 的不匹配对象。

编辑:我想补充一点,记录的 - 1,2,7 - 对应于(1)对象(例如表,存储过程)或列,(2)参数,(7)索引。在您的情况下,它应该涵盖您正在寻找的内容。

不直接回答您的问题,但一些额外的资源:

我有一个关于将内置扩展属性用于文档等内容的演示文稿:http://code.google.com/p/caderoux/wiki/LeversAndTurtles

最近在SQLServer Central上发表了Adam Aspin关于扩展属性的一系列文章:

http://www.sqlservercentral.com/articles/Metadata/72607/

http://www.sqlservercentral.com/articles/Metadata/72608/

http://www.sqlservercentral.com/articles/Metadata/72609/

http://www.sqlservercentral.com/articles/Metadata/72610/

最新更新