好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

访问元数据的三种方法.doc

7页
  • 卖家[上传人]:xiao****1972
  • 文档编号:84846343
  • 上传时间:2019-03-05
  • 文档格式:DOC
  • 文档大小:70.48KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 访问 Microsoft SQL Server 元数据的三种方法 上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中、高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:1. 某个数据库中的表和视图的个数以及名称 ;2. 某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;3. 某个表上定义的约束;4. 某个表上定义的索引以及主键/外键的信息下面我们将介绍几种获取元数据的方法获取元数据 使用系统存储过程与系统函数访问元数据获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据常用的与元数据有关的系统存储过程有以下一些:系统存储过程描述sp_columns返回指定表或视图的列的详细信息。

      sp_databases返回当前服务器上的所有数据库的基本信息sp_fkeys若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表sp_pkeys返回指定表的主键信息sp_server_info返回当前服务器的各种特性及其对应取值sp_sproc_columns返回指定存储过程的的输入、输出参数的信息sp_statistics返回指定的表或索引视图上的所有索引以及统计的信息sp_stored_procedures返回当前数据库的存储过程列表,包含系统存储过程sp_tables返回当前数据库的所有表和视图,包含系统表常用的与元数据有关的系统函数有以下一些:系统函数描述COLUMNPROPERTY返回有关列或过程参数的信息,如是否允许空值,是否为计算列等COL_LENGTH返回指定数据库的指定属性值,如是否处于只读模式等DATABASEPROPERTYEX返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等OBJECT_ID返回指定数据库对象名的标识号OBJECT_NAME返回指定数据库对象标识号的对象名。

      OBJECTPROPERTY返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等fn_listextendedproperty返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:EXEC sp_databasesGO在返回结果中我们可以看到数据库的名称、大小及备注等信息但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:CREATE TABLE #sp_result(DATABASE_NAME sysname,DATABASE_SIZE int,REMARKS varchar(254) NULL)GOINSERT INTO #sp_result EXEC ('sp_databases')GO使用信息架构视图访问元数据 信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。

      信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的常用的信息架构视图有以下一些:信息架构视图描述INFORMATION_SCHEMA .CHECK_CONSTRAINTS返回有关列或过程参数的信息,如是否允许空值,是否为计算列等INFORMATION_SCHEMA .COLUMNS返回当前数据库中当前用户可以访问的所有列及其基本信息INFORMATION_SCHEMA .CONSTRAINT_COLUMN_USAGE返回当前数据库中定义了约束的所有列及其约束名INFORMATION_SCHEMA .CONSTRAINT_TABLE_USAGE返回当前数据库中定义了约束的所有表及其约束名INFORMATION_SCHEMA .KEY_COLUMN_USAGE返回当前数据库中作为主键/外键约束的所有列INFORMATION_SCHEMA .SCHEMATA返回当前用户具有权限的所有数据库及其基本信息INFORMATION_SCHEMA .TABLES返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。

      INFORMATION_SCHEMA .VIEWS返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息例如,我们要得到某个表有多少列,可以使用以下语句:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='mytable'使用系统表访问元数据虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些:系统表描述syscolumns存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息syscomments存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。

      sysconstraints存储当前数据库中每一个约束的基本信息sysdatabases存储当前服务器上每一个数据库的基本信息sysindexes存储当前数据库中的每个索引的信息sysobjects存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息sysreferences存储所有包括 FOREIGN KEY 约束的列systypes存储系统提供的每种数据类型和用户定义数据类型的详细信息将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息示例:1、 获得当前数据库所有用户表的名称SELECT OBJECT_NAME (id)FROM sysobjectsWHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象2、 获得指定表上所有的索引名称SELECT name FROM sysindexesWHERE id = OBJECT_ID ('mytable') AND indid > 0综合实例 下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。

      DECLARE @sp_name nvarchar(400)DECLARE @sp_content nvarchar(2000)DECLARE @asbegin intdeclare @now datetimeselect @now = getdate()DECLARE sp_cursor CURSOR FOR SELECT object_name(id)FROM sysobjectsWHERE xtype = 'P' AND type = 'P' AND crdate < @nowAND OBJECTPROPERTY(id, 'IsMSShipped')=0OPEN sp_cursorFETCH NEXT FROM sp_cursor INTO @sp_nameWHILE @@FETCH_STATUS = 0BEGINSELECT @sp_content = text FROM syscomments WHERE id = OBJECT_ID(@sp_name) SELECT @asbegin = PATINDEX ( '%AS' + char(13) + '%', @sp_content) SELECT @sp_content = SUBSTRING(@sp_content, 1, @asbegin - 1) + ' WITH ENCRYPTION AS'+ SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'EXEC sp_executesql @sp_name EXEC sp_executesql @sp_contentFETCH NEXT FROM sp_cursor INTO @sp_nameENDCLOSE sp_cursor DEALLOCATE sp_cursor该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。

      本存储过程在 SQL Server 2000 上通过参考资料 1. Microsoft SQL Server 2000 联机丛书2. 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.