当前位置: 首页 > 编程日记 > 正文

访问 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_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 上通过。

转载于:https://www.cnblogs.com/umen/archive/2010/11/16/1878321.html

相关文章:

apply()智用:需要几个参数但只有一个参数数组

比奇堡的居民海绵宝宝&#xff0c;派大星&#xff0c;蟹老板正在开party let arr [SpongeBob,Patrick,Mr.Crab]; 如果章鱼哥来了&#xff0c;珊迪也来了 arr.push(Squidward Tentacles,Sandy); 此时一共派对有5人 如果章鱼哥和珊迪一起来了 arr.push.apply(arr,[Squidwar…

HTML转WORD WORD转PDF--来源网络

从网上找的代码&#xff0c;先收藏下。 功能&#xff1a;实现HTML转WORD&#xff0c;WORD转PDF view source print?using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using Syst…

正则表达式小结

基础 数量匹配 *代表{0,} 代表{1,} ?代表{0,1} [0-9][0-9]{1,} 表示匹配0~9中的任意数字&#xff0c;并且至少1位。 [0-9]*[0-9]{0,} 表示匹配0~9中的任意数字&#xff0c;并且可以是0位&#xff08;不存在&#xff09;。 [0-9]?[0-9]{0,1} 表示匹配0~9中的任意数字&…

Log控制台打印设置

android Log.isLoggable方法的使用 android 动态控制logcat日志开关,通过Log.isLoggable&#xff08;TAG,level&#xff09;方法动态控制&#xff0c;1.添加日志的时候加入判断&#xff0c; String TAG"Volley"; boolean isDbugLog.isLoggable(TAG, Lo…

JavaScript 定义类时如何将方法提取出来

现在我们有一个海洋生物类 function marineLife(name,job,friend){this.name name;this.job job;this.friend friend;this.introduceMyself function(){console.log(大家好&#xff01;我叫this.name,我是一名this.job,我最好的朋友是this.friend);} } 让我们用这个类新建…

错误:Error #2032解决方案

问题&#xff1a; Error #2032错误要访问外部数据&#xff0c;必须信任此文件。 现象&#xff1a; 要访问外部数据&#xff0c;必须信任此文件。 对于 PDF 文件&#xff0c;在 Adobe Reader 中&#xff0c;单击“Edit”&#xff08;编辑&#xff09;>“Preferences”&#…

[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化

[泛型的概念]&#xff08;1&#xff09;没有泛型的时候&#xff0c;所有的对象都是以object为基础&#xff0c;如果要使用时必须进行强制类型转换&#xff0c;如果对于值类型&#xff0c;则会导致不断拆箱装箱的过程&#xff0c;对系统消耗很大。&#xff08;2&#xff09;使用…

docker宿主机访问docker容器服务失败

2019独角兽企业重金招聘Python工程师标准>>> 原因&#xff1a; 因为docker的虚拟ip网段是172.17.*。*与局域网的ip网段172.17冲突了&#xff0c;所以有两种方式&#xff1a; 解决方法&#xff1a; 一、 修改docker网卡信息&#xff0c;将网段改为与局域网不同的即可…

从变量地址到指针再到指针变量

标题中的3个概念&#xff1a;变量地址、指针and指针变量是依次出现的&#xff0c;逐个确定就可以明晰到底什么是我们常说的指针(其实是指针变量) 首先&#xff0c;变量在本质上是一段存储空间&#xff0c;既然是存储空间&#xff0c;就必有地址&#xff0c;一般每个字节有一个…

Lua bind 和 conf 实现

Lua &#xff0c;语法简单&#xff08;极像javascript), 移植性好(纯C实现), 启动速度快&#xff0c;空间占用小&#xff0c; 真不愧是潜入式脚本语言之王。 本人想拿它来做 配置文件(conf)&#xff0c;也想加一点IoC, 就是配置脚本可以调用主程序的函数。 实现如下&#xff1…

通过反射执行get、set方法

Class clazz sourceObj.getClass(); 1、获取所有属性 BeanInfo beanInfo Introspector.getBeanInfo(clazz); PropertyDescriptor[] pds beanInfo.getPropertyDescriptors(); 2、获取指定属性 PropertyDescriptor pd new PropertyDescriptor(fieldName, clazz); Method getM…

h5 移动端 关于监测切换程序到后台或息屏事件和visibilitychange的使用

需求&#xff1a;当我们页面上正在播放视频或者播放背景音乐时&#xff0c;我们屏幕自动息屏或者切换程序去看消息时&#xff0c;我们希望暂停视频或背景音乐&#xff0c;回到程序我们希望继续播放视频或播放背景音乐。小程序上提供了 onUnload返回 onHide退出 onShow重新进入等…

一份整理 | PyTorch是什么,为何选择它

PyTorch是什么 PyTorch的特性 PyTorch是什么 PyTorch是一个基于Python的科学计算包&#xff0c;主要提供以下两种用途&#xff1a; 在GPU算力或其他加速器上作为NumPy的替代一个用于实现神经网络的自动求导库 PyTorch的特性 PyTorch的祖先是Chainer,HIPS autograd,twitter…

jquery实现心算练习

看看大家做完要多长时间&#xff0c;不能上传附近&#xff0c;就只得贴代码。代码如下&#xff1a; 代码 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <htm…

C/C++利用三元组实现稀疏矩阵运算

三元组&#xff08;&#xff08;x&#xff0c;y&#xff09;&#xff0c;z&#xff09;其中&#xff08;x&#xff0c;y&#xff09;表示非零元位置&#xff0c;z表示该坐标的值 由于实际操作时&#xff0c;我们所用的矩阵0非常多&#xff0c;所以一个一个输入值很浪费时间&…

Database项目中关于Procedure sp_refreshsqlmodule_internal的错误

最近项目中发现一怪问题&#xff0c;使用DB项目发布数据库时&#xff0c;总提示 “(110,1): SQL72014: .Net SqlClient Data Provider: Msg 1222, Level 16, State 56, Procedure sp_refreshsqlmodule_internal, Line 67 Lock request time out period exceeded. An error occu…

脱离公式谈谈对反向传播算法的理解

机器学习的训练过程可看作是最优化问题的求解过程。 根据原理 对于函数f(x),如果f(x)在点xt附近是连续可微的&#xff0c;那么f(x)下降最快的方向是f(x)在xt点的梯度的反方向 得到最简单最常用的优化算法&#xff1a;梯度下降法(Gradient Descent Method)。 可以想见&#xf…

如何在Form中使用键弹性域(Key Flexfield)

在应用弹性域之前必须先定义弹性域&#xff0c;定义之前必须先注册表列。如果你的弹性域已经在Oracle Application Object Library中已经定义和注册了&#xff0c;并且弹性域表和列已经在数据库中存在&#xff0c;则忽略1、2、3步骤&#xff0c;适用于关键性也适用于描述性弹性…

什么是SOLID原则(第3部分)

让我们从最后一个 SOLID 原则开始吧&#xff0c;即依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;简称 DIP&#xff09;&#xff08;不要和依赖注入Dependency Injection &#xff0c;DI 弄混淆了&#xff09;。这个原则所说的是高级模块不应该依赖具象的…

李彦宏,韩寒等入围本年度《时代百人》候选名单

美国《时代》杂志周六&#xff08;4月3日&#xff09;公布了2010年度 “百位全球最具影响力人物”的200名候选人名单,其中中国最大网络搜索公司“百度”总裁李彦宏也以成功企业家入围候选人,同时入围的还有年仅27岁的80后作家韩寒。 其它“全球最具影响力人物”候选人名单中还包…

win10如何查看NVIDIA驱动的版本

入口 输入&#xff1a;控制面板 选择&#xff1a;硬件和声音 选择NVIDIA控制面板 点击小房子图标 看到版本是391.25

vb中5种打开文件夹浏览框的方法总结(转)

代码 众所周知&#xff0c;在vb中如果是打开某一个文件的话&#xff0c;非常简单&#xff0c;使用CommonDialog组件即可轻松完成&#xff0c;但是他只能选择文件&#xff0c;之后或许选取的文件路径&#xff0c;而如果想要浏览文件夹&#xff0c;就没这么方便了。这里介绍3个办…

R语言文摘:Subsetting Data

原文地址&#xff1a;https://www.statmethods.net/management/subset.html R has powerful indexing features for accessing object elements. These features can be used to select and exclude variables and observations. The following code snippets demonstrate ways…

Ubuntu系统

1. Ubuntu 14.04 LTS安装 直接从官网下载Ubuntu14.04.2LTS http://www.ubuntu.com/download/desktop (你也可以下载最新的14.10---据说改变不大) 个人采用的是U盘安装,用了UltraISO这款软件(百度软件中心中便有---可以不破解试用来完成目的):具体流程: UltraISO上端文件打开,将…

win10下Anaconda如何查看PyTorch版本

以管理员身份打开Anaconda Powershell Prompt 按顺序输入以下三行命令即可

6年iOS开发程序员总结组件化—让你的项目一步到位

纯个人学习笔记分享, 不喜勿喷,自行取关! 技术不缺乏缔造者,网络不缺乏键盘侠,但缺乏分享技术的源动力! 近几年组件化大家吵的沸沸扬扬的&#xff0c;它其实也不是什么黄金圣衣&#xff0c;穿上立马让你的小宇宙提升几个档次&#xff0c;也不是海皇的三叉戟&#xff0c;入手就能…

处理问题的方法--抽象和特例化

事实上我们在软件开发的过程中总是&#xff1a;遇到问题&#xff0c;解决问题&#xff0c;这么一个 简单的过程。处理一般类似问题的时候&#xff0c;我们经过抽象&#xff0c;有的提取算法&#xff0c;有的提取结构&#xff0c;有的提取流程等等&#xff0c;这样的过程可以简单…

121-Best Time to Buy and Sell Stock

题目&#xff1a; Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum p…

控制行输入以下两句命令16倍速播放青年大学习

//得到视频标签 playRate document.getElementsByTagName(video); //改变播放速率 playRate.Bvideo.playbackRate 16;

ios 8+ (xcode 6.0 +)应用程序Ad Hoc 发布前多设备测试流程详解

我们开发的程序在经过simulator以及自己的iOS设备测试后&#xff0c;也基本完成应用程序了&#xff0c;这时候我们就可以把它发布出去了更更多的人去测试&#xff0c;我们可以在iOS平台使用ad hoc实现。 你在苹果购买的开发者会员账号&#xff0c;允许100台设备和你的账号关联。…