接上文:SQL Server目录视图教程:数据库和文件目录视图 下一个SQL Server目录视图的子类型是对象视图。顾名思义,这些视图返回数据库对象的信息。这些视图中最有用的就是“sys.objects”,它可以返回指定数据库中用户定义的,模式范围内的对象。例如,在下面的“SELECT”语句中,我使用“sys.objects”视图来提取“AdventureWorks ”数据库中唯一性约束清单: USE AdventureWorks2008; GO SELECT a.name AS ObjectName, ( SELECT b……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
接上文:SQL Server目录视图教程:数据库和文件目录视图
下一个SQL Server目录视图的子类型是对象视图。顾名思义,这些视图返回数据库对象的信息。这些视图中最有用的就是“sys.objects”,它可以返回指定数据库中用户定义的,模式范围内的对象。例如,在下面的“SELECT”语句中,我使用“sys.objects”视图来提取“AdventureWorks ”数据库中唯一性约束清单:
USE AdventureWorks2008; GO SELECT a.name AS ObjectName, ( SELECT b.name FROM sys.objects b WHERE b.object_id = a.parent_object_id ) AS ParentTable FROM sys.objects a WHERE a.type = 'UQ'; |
在该“SELECT”语句中,我提取了唯一性约束名称和与这些限制关联的父对象(表)的名称。为了提取该表的名称,我创建了一个子查询,把父对象ID与常规对象ID进行了关联。(父对象和子对象都能在“sys.objects”视图中查到。)
我还在该语句中加上了“WHERE”从句,只返回那些值类型是“UQ”的行。“UQ”代码代表的是唯一性约束(unique constraint)。正如下面的结果所示,“AdventureWorks 2008”数据库只包含唯一性约束,是在document表中定义的。
ObjectName | ParentTable |
UQ__Document__F73921F730F848ED | Document |
在对象子类别中另一个有用的视图是“sys.tables”,它返回数据库中配置的用户定义的表清单。下面的“SELECT”语句使用该视图在“AdventureWorks 2008”数据库对象“HumanResources ”中提取表清单:
USE AdventureWorks2008; GO SELECT name AS TableName, is_replicated AS IsReplicated, is_tracked_by_cdc AS IsTracked FROM sys.tables WHERE schema_id IN ( SELECT schema_id FROM sys.schemas WHERE name = 'HumanResources' ); |
如你所见,我提取了表名称,以及它们是被Change Data Capture跟踪的还是复制的。请注意,为了限制只查询“”对象,我在“WHERE”从句中包含了一个子查询,基于对象名称提取对象ID。下表展示了通过“sys.tables ”视图查询出来的结果:
TableName | IsReplicated | IsTracked |
Department | 0 | 0 |
Employee | 0 | 0 |
EmployeeDepartmentHistory | 0 | 0 |
EmployeePayHistory | 0 | 0 |
JobCandidate | 0 | 0 |
Shift | 0 | 0 |
正如结果所示,在“HumanResources ”对象中有六个表。“is_replicated”和“is_tracked_by_cdc”列都被配置为bit列,其中“0”表示false,“1”表示true。表中数据全为“0”意味着没有一个表是被 Change Data Capture复制的或者跟踪的。
下面这个例子与上面的类似,只是我使用了“sys.procedures”视图来提取“HumanResources ”对象中包含的存储过程清单:
USEAdventureWorks2008; GO SELECT name AS ProcName, type AS ProcType, type_desc AS ProcDescript FROM sys.procedures WHERE schema_id IN ( SELECT schema_id FROM sys.schemas WHERE name = 'HumanResources' ); |
在本例中,我提取了存储过程的名称和类型(包括存储过程代码和描述)。与前面一样,我在“WHERE”从句中使用了子查询来限制只获取指定对象的数据。该“SELECT”语句返回结果如下表:
ProcName | ProcType | ProcDescript |
uspUpdateEmployeeHireInfo | P | SQL_STORED_PROCEDURE |
uspUpdateEmployeeLogin | P | SQL_STORED_PROCEDURE |
uspUpdateEmployeePersonalInfo | P | SQL_STORED_PROCEDURE |
如你所见,结果只包含SQL存储过程。然而,“sys.procedures”视图还将返回“公共语言运行时”存储过程,外部存储过程,以及复制过滤器存储过程,如果数据库中有的话。
如果你想提取表或视图中关于列的信息,请使用“sys.columns”视图。在下面的例子中,我提取了“AdventureWorks 2008”数据库中名称包含“history”(模糊匹配)的所有对象,表和列的名称:
USEAdventureWorks2008; GO SELECT s.name AS SchemaName, o.name AS ViewName, c.name AS ColumnName FROM sys.columns c INNER JOIN sys.objects o ON c.object_id = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.type = 'V' AND o.name LIKE '%history%' ORDER BY s.name, o.name, c.name; |
为了提取视图和对象的名称,我对“sys.columns”视图和“sys.schemas”视图做了联合查询。然后,我使用“WHERE”从句限制查询类型V的对象(视图views)要求对象名称中包含“history”。从执行结果来看,“AdventureWorks 2008”数据库只包含一个带有“history”字样的视图,如下面结果所示:
SchemaName | ViewName | ColumnName |
HumanResources | vEmployeeDepartmentHistory | BusinessEntityID |
HumanResources | vEmployeeDepartmentHistory | Department |
HumanResources | vEmployeeDepartmentHistory | EndDate |
HumanResources | vEmployeeDepartmentHistory | FirstName |
HumanResources | vEmployeeDepartmentHistory | GroupName |
HumanResources | vEmployeeDepartmentHistory | LastName |
HumanResources | vEmployeeDepartmentHistory | MiddleName |
HumanResources | vEmployeeDepartmentHistory | Shift |
HumanResources | vEmployeeDepartmentHistory | StartDate |
HumanResources | vEmployeeDepartmentHistory | Suffix |
HumanResources | vEmployeeDepartmentHistory | Title |
SQL Server还提供了一个目录视图,允许你查看数据库中配置的索引。例如,在下面的“SELECT”语句中,我使用“sys.indexes”视图提取“AdventureWorks 2008”数据库“Person”表中定义的所有索引信息:
USEAdventureWorks2008; GO SELECT name AS IndexName, type_desc AS IndexType, is_primary_key AS PrimaryKey, is_unique AS UniqueIndex FROM sys.indexes WHERE object_id IN ( SELECT object_id FROM sys.objects WHERE name = 'person' ); |
在本例中,我提取了“Person”表每个索引的名称和类型,以及该索引是主键索引还是唯一索引的信息。为了限制只查询“Person”表的数据,我在“WHERE”从句中使用了子查询来提取与“Person”表关联的对象ID。下面的结果展示了该表定义的索引:
IndexName | IndexType | PrimaryKey | UniqueIndex |
PK_Person_BusinessEntityID | CLUSTERED | 1 | 1 |
IX_Person_LastName_FirstName_MiddleName | NONCLUSTERED | 0 | 0 |
AK_Person_rowguid | NONCLUSTERED | 0 | 1 |
PXML_Person_AddContact | XML | 0 | 0 |
PXML_Person_Demographics | XML | 0 | 0 |
XMLPATH_Person_Demographics | XML | 0 | 0 |
XMLPROPERTY_Person_Demographics | XML | 0 | 0 |
XMLVALUE_Person_Demographics | XML | 0 | 0 |
我在这里展示的例子只是SQL Server所提供对象目录视图中的一部分。还有与对象视图相关的装配模块,计算列,时间,识别列,触发器,同义词以及其他对象类型。要获取所有对象视图的清单,请参看SQL Server联机丛书相关主题“对象目录视图(Transact-SQL)”。
翻译
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。