关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »获取SQL Server元数据得正确操作步骤

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

    2010-07-05 09:34:00 出处:ITJS
    分享

    我们今天是要和大家一起讨论的是正确获取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  @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 上通过。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。