当前位置:首页 > 系统运维 > 正文内容

获取SQL Server元数据得正确操作步骤

a8116255316年前 (2010-07-05)系统运维10

我们今天是要和大家一起讨论的是正确获取SQL Server元数据的实际操作 *** ,同时本文也介绍了元数据的概念,以及对正确获得元数据的实际操作步骤的具体描述,以下就是文章的主要内容描述。

元数据简介

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

某个数据库中的表和视图的个数以及名称;

某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;

某个表上定义的约束;

某个表上定义的索引以及主键/外键的信息。

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

获取元数据

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

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

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

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

系统存储过程

sp_columns 返回指定表或视图的列的详细信息。

sp_databases 返回当前服务器上的所有数据库的基本信息。

sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。

sp_pkeys 返回指定表的主键信息。

sp_server_info 返回当前服务器的各种特性及其对应取值。

sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。

sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。

sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。

sp_tables 返回当前数据库的所有表和视图,包含系统表。

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

系统函数

COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。

COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。

DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。

OBJECT_ID 返回指定数据库对象名的标识号

OBJECT_NAME 返回指定数据库对象标识号的对象名。

OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。

fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。

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

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

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 Server元数据

信息架构视图基于 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 的系统表非常多,其中最常用的与SQL Server元数据查询有关的表有如下一些:

syscolumns 存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息。

syscomments 存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。

sysconstraints 存储当前数据库中每一个约束的基本信息。

sysdatabases 存储当前服务器上每一个数据库的基本信息。

sysindexes 存储当前数据库中的每个索引的信息。

sysobjects 存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息。

sysreferences 存储所有包括 FOREIGN KEY 约束的列。

systypes 存储系统提供的每种数据类型和用户定义数据类型的详细信息。

将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的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  @a *** egin 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 @a *** egin = PATINDEX   ( '%AS' + char(13) + '%', @sp_content) SELECT @sp_content = SUBSTRING(@sp_content, 1,   @a *** egin - 1) + ' WITH ENCRYPTION AS' + SUBSTRING (@sp_content, @a *** egin+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 上通过。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/21465.html

分享给朋友:

“获取SQL Server元数据得正确操作步骤” 的相关文章

windows 7鼠标停顿怎么办?windows 7 usb鼠标停顿的原因以及解决

windows 7鼠标停顿怎么办?windows 7 usb鼠标停顿的原因以及解决

很多使用Windows 7系统的朋友都想小编反应,假如暂停使用电脑,鼠标会出现停顿现象,这是怎么回事呢 该怎么解决呢 下面就和小编一起去看下Windows 7 usb鼠标停顿的解决方法吧。 由于Windows 7系统中有一项USB选择性暂停造成的。这项设置主要为了节电,当他检测到用户没有对系统进行...

如何删除自带的不常用应用为windows 7减负

如何删除自带的不常用应用为windows 7减负

对于Windows 7系统来说,其默认安装的许多工具是我们很少使用或从来不用的,比如系统自带的扫雷、纸牌游戏等。删除此类长期不用的系统组件,不但可以让系统更清爽,更重要的是还可以提高系统的运行速度,特别是对于硬件配置相对较低的上网本来说,尤其如此。接下来,笔者就给大家介绍一下如何删除Windows...

各个都很实用:windows 7系统电脑日常小技巧

各个都很实用:windows 7系统电脑日常小技巧

在使用Windows 7的时候很多用户对于系统的很多功能并不是很了解,也正是因为这样的不了解导致很多用户在使用Win 之后并不能体验Windows 7的功能便携和强大功能,导致很多用户对于Windows 7的认识还是比较模糊,不过为了让更多的朋友了解Windows 7的特点和便携应用,今天就为大家汇...

windows 7系统开机后出现黑屏提示Windows无法启动

windows 7系统开机后出现黑屏提示Windows无法启动

一些用户的Windows 7系统开机后出现黑屏,代码为 Windows无法启动: WindowsSystem32ConfigSystem”。这个问题该如何修复呢?现在小编就给大家分析一下吧。 其实这个代码的意思是引导文件丢失了,引导文件(NTLDR)一般存放于C盘根目录下,是一个具有隐藏和只读属性...

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

解决方法: 其实处理这些使用流氓软件,需要将相关的.exe文件删除,使它不能再运行,或者直接清除这个服务本身,使计算机重启的时候,它不会再启动。比如Hijackthis扫描,在扫描日志中,一般会把非Windows系统的服务以023的方式列出来,如下面这段: O23 - ...

windows 7/8/xp系统关闭自动播放功能禁止音频媒体自动播放

windows 7/8/xp系统关闭自动播放功能禁止音频媒体自动播放

Windows 7/8系统: 控制面板——自动播放——取消掉为所有媒体和设备设置自动播放 winXP系统: 开始—运行—gpedit.msc—计算机配置—管理模板—系统—关闭自动播放—已启用—所有驱动器—确定  关闭自动运行功能说明: 一旦您将媒体插入驱动器...