转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Sql Server >> 正文
访问 Microsoft SQL Server 元数据的三种方法         

访问 Microsoft SQL Server 元数据的三种方法

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1083 更新时间:2007/11/14 12:57:37
 

上海微创软件有限公司 肖桂东

适用读者:Microsoft SQL Server 中、高级用户

元数据简介

元数据 (metadata) 最常见的定义为有关数据的结构数据,或者再简单一点就是关于数据的信息,日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:



  1. 某个数据库中的表和视图的个数以及名称 ;
  2. 某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;
  3. 某个表上定义的约束;
  4. 某个表上定义的索引以及主键/外键的信息。

下面我们将介绍几种获取元数据的方法。


获取元数据


使用系统存储过程与系统函数访问元数据


获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数。


系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。


常用的与元数据有关的系统存储过程有以下一些:


常用的与元数据有关的系统函数有以下一些:


由于我们无法直接利用到存储过程与函数的返回结果,因此只有在我们关心的只是查询的结果,而不需要进一步利用这些结果的时候,我们会使用系统存储过程与系统函数来查询元数据。


例如,如果要获得当前服务器上所有数据库的基本信息,我们可以在查询分析器里面运行:


EXEC sp_databases
GO


在返回结果中我们可以看到数据库的名称、大小及备注等信息。


但是如果要引用这部分信息,或者存储这部分信息以供后面使用,那么我们必须借助中间表来完成这个操作:


CREATE TABLE #sp_result
(
DATABASE_NAME sysname,
DATABASE_SIZE int,
REMARKS varchar(254) NULL
)
GO
INSERT INTO #sp_result
EXEC (sp_databases)
GO

使用信息架构视图访问元数据

信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的。


常用的信息架构视图有以下一些:


由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。


例如,我们要得到某个表有多少列,可以使用以下语句:


SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=mytable


使用系统表访问元数据


虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理。


SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些:



将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息。


示例:
1、 获得当前数据库所有用户表的名称。


SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = U AND OBJECTPROPERTY (id, IsMSShipped) = 0


其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象。


2、 获得指定表上所有的索引名称


SELECT name FROM sysindexes
WHERE id = OBJECT_ID (mytable) AND indid > 0


综合实例


下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。


DECLARE @sp_name nvarchar(400)
DECLARE @sp_content nvarchar(2000)
DECLARE @asbegin int
declare @now datetime
select @now = getdate()
DECLARE sp_cursor CURSOR FOR
SELECT object_name(id)
FROM sysobjects
WHERE xtype = P
AND type = P
AND crdate < @now
AND OBJECTPROPERTY(id, IsMSShipped)=0


OPEN sp_cursor


FETCH NEXT FROM sp_cursor
INTO @sp_name


WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @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_content
FETCH NEXT FROM sp_cursor
INTO @sp_name
END


CLOSE sp_cursor
DEALLOCATE sp_cursor


该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。本存储过程在 SQL Server 2000 上通过。


[Access]sql随机抽取记录  [Access]ASP&SQL让select查询结果随机排序的实现方法
[Web开发]如何创建并使用数据库通用访问类(即自定义类)  [Web开发]网站文件操作出现访问被拒绝的解决办法
[Web开发]宽带用户架设个人WEB服务器外网无法访问的解决方案  [网页制作]一个虚拟空间如何放两个或多个网站,并且保证都能…
[操作系统]在DOS下使用NET命令访问网上邻居,搜刮共享文件为…  [操作系统]如何设置注册表用户的访问权限
[操作系统]禁止访问网上邻居的多种方法  [操作系统]ldap:///(没有响应)Windows无法访问指定设备、路径…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台