`
pavel
  • 浏览: 931128 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

获取SQL Server数据库元数据的方法

阅读更多

数据简介

元数据 (metadata) 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据的信息”,日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 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 返回当前数据库的所有表和视图,包含系统表。

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

系统函数

◆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-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 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 上通过。

分享到:
评论

相关推荐

    如何获取SQLServer数据库元数据的方法[文].pdf

    "如何获取SQL Server数据库元数据的方法" 元数据简介: 元数据(metadata)是关于数据的结构数据,或者再简单一点就是关于数据的信息。在关系型数据库管理系统(DBMS)中,元数据描述了数据的结构和意义。在日常...

    如何获取SQL Server数据库元数据的方法

    元数据(metadata)最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据的信息”,日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。...本文介绍了几种获取元数据的方法。

    获取SQL Server数据库元数据的几种方法

    比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息: ◆某个数据库中的表和视图的个数以及名称; ◆某个表或者视图中列的个数以及每一列的名称、数据类型、...

    SQL Server数据库文档生成器

    这个工具通过解析数据库元数据,能自动收集上述信息并生成结构化的文档。这不仅减少了人工录入错误,还节约了大量时间。通常,生成的文档可能包括XML、HTML或PDF格式,便于在不同环境中查看和分享。 5. **界面友好...

    获取SQL_Server元数据的几种方法

    在SQL Server中,获取元数据是数据库管理和开发过程中的重要环节。元数据包含了关于数据库对象如表、视图、索引、存储过程等的详细信息。这篇文章将介绍两种主要的获取SQL Server元数据的方法:使用系统存储过程和...

    解决SQL Server数据库被标记为“Suspect”的方法.pdf

    为了解决这一问题,本文将介绍一种方法,该方法对Sybase SQL Server和Microsoft SQL Server数据库均适用,具有操作简便和安全可靠的特点。该方法的优势在于操作简单和良好的安全性。文章还提到了数据转换服务、可疑...

    sql server 数据库文件——图书订购

    在SQL Server中,数据库文件是存储数据和元数据的核心组件,它们构成了数据库的基础。本案例提供的"图书订购"数据库文件包含两个主要部分:mdf(主数据文件)和ldf(日志文件)。这两个文件是SQL Server数据库不可或...

    JAVA与SQLServer数据库连接总结.doc

    本文将详细介绍JAVA与SQLServer数据库连接的总结,包括使用JDBC-ODBC桥方式和JDBC直接连接SQLServer数据库两种方法。 一、使用JDBC-ODBC桥方式连接SQLServer数据库 使用JDBC-ODBC桥方式连接SQLServer数据库需要...

    使用PowerDesigner设计SQL Server数据库

    ### 使用PowerDesigner设计SQL Server数据库知识点详解 #### 一、PowerDesigner概述 - **PowerDesigner**是一款由SAP公司开发的强大的数据建模工具,它能够帮助开发者进行数据库设计、元数据管理和数据仓库构建等...

    SQL Server 数据库连接包

    包括存储过程调用、参数化查询、元数据获取等功能,使得SQL Server的高级特性也能在Java应用中充分利用。 10. **兼容性与版本**: SQL Server数据库连接包通常会随着SQL Server的新版本更新,以保持与最新特性的...

    数据字典导出工具 导出SqlServer数据库的数据字典

    2. 视图信息:视图是基于一个或多个表的查询结果,导出视图的元数据有助于了解视图的来源和逻辑结构,这对于分析查询性能和重构视图很有帮助。 3. 索引信息:索引是提高数据库查询速度的关键,导出的索引信息可以...

    sqlserver数据库查看器

    SQLServer数据库查看器是一款专为管理和查看SQL Server服务器上的数据库设计的应用程序。它提供了全面的数据库浏览和查询功能,使得用户能够轻松地查看服务器上的所有数据库,以及数据库中包含的表和字段信息。这款...

    DaBCos(SQLServer数据库结构比对)

    《DaBCos:SQLServer数据库结构比对工具详解》 在数据库管理中,确保数据库结构的一致性至关重要,尤其是在多环境部署、版本升级或者数据迁移的过程中。DaBCos,一个专为SQL Server设计的数据库结构比对工具,...

    C#读取SQLServer数据库并生成数据结构图

    本主题聚焦于如何利用C#来读取SQL Server数据库,并生成数据结构图,这对于理解和可视化数据库的架构至关重要。 首先,要实现这个功能,我们需要了解几个关键概念: 1. **ADO.NET**: ADO.NET是微软提供的一个数据...

    MFC(VS)保存图片到SQLServer数据库

    在Windows 10 64位操作系统中,使用Visual Studio 2017的MFC(Microsoft Foundation Classes)框架开发应用程序时,有时我们需要处理图像数据并将其存储到SQL Server数据库中。MFC是C++的一个类库,它为构建Windows...

    如何查看SQLServer数据库每个表占用的空间大小

    CREATE PROCEDURE [dbo] [sys viewTableSpace] AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo] #tableinfo 表名 [varchar] 50 COLLATE Chinese PRC CI AS NULL 记录数 [int] NULL

    Delphi操作SQLSERVER数据库动态增加字段

    本文将深入探讨如何使用Delphi操作SQL Server数据库来动态地增加字段,帮助开发者更好地理解和实现这一功能。 首先,理解Delphi与SQL Server的交互方式是必要的。Delphi提供了多种库和组件来连接并操作SQL Server...

    SQL Server导出数据字典工具

    SQL Server是一款广泛应用...总的来说,"SQL Server导出数据字典工具"是数据库管理员和开发人员的得力助手,它简化了获取和管理SQL Server数据库元数据的过程,提高了工作效率,同时也为数据库的维护和优化提供了便利。

Global site tag (gtag.js) - Google Analytics