在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信
TOP

返回
顶部

SQL Server数据库对于应用程序的关系

发布时间:2019-04-13浏览次数:1023 <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">以下的文章主要是介绍SQL Server数据库与其实际应用元数据,我前两天在相关网站看见SQL Server数据库与其实际应用元数据的资料,觉得挺好,就拿出来供大家分享,希望会给大家带来一些帮助在此方面。 我常被问到如何把驻留在物理服务器/SQL 实例上的SQL Server数据库转</font> </td> </tr></tbody></table> <p>  以下的文章主要是介绍<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>与其实际应用元数据,我前两天在相关网站看见<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>与其实际应用元数据的资料,觉得挺好,就拿出来供大家分享,希望会给大家带来一些帮助在此方面。</p> <p>  我常被问到如何把驻留在物理服务器/<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例上的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>转变为它们相应的应用程序名称。在准备计划好的服务器停机通知时,这种需要就产生了,但在我的组织内与IT经理或非技术人员沟通时,这也是有价值的。如果你不是数据</p> <p>  我常被问到如何把驻留在物理服务器/<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例上的<a href="http://www.webjx.com/database/"><u>数据库</u></a>转变为它们相应的应用程序名称。在准备计划好的服务器停机通知时,这种需要就产生了,但在我的组织内与IT经理或非技术人员沟通时,这也是有价值的。</p> <p>  如果你不是<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员或特定<a href="http://www.webjx.com/database/"><u>数据库</u></a>的应用分析师,你通常会无视<a href="http://www.webjx.com/database/"><u>数据库</u></a>的命名规则,而这些<a href="http://www.webjx.com/database/"><u>数据库</u></a>支持着你每日依赖的应用程序。这就是为什么当需要产生时在适当的位置上由元<a href="http://www.webjx.com/database/"><u>数据库</u></a>来提供转化很重要。</p> <p>  专家解答</p> <p>  大部分<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员拥有某种形式的<a href="http://www.webjx.com/database/"><u>数据库</u></a>元<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>,他们依赖其来跟踪范围很广的Microsoft <a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>环境。我利用连接的服务器和分布式<a href="http://www.webjx.com/database/"><u>数据库</u></a>访问来建立一个已经在我的环境中使用了七年的元<a href="http://www.webjx.com/database/"><u>数据库</u></a>。它不是漂亮的,但它是功能性很强的。</p> <p>  跟很多IT开发者和<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员一样,即使它有自身的不足我还是为自己的创造感到骄傲。它很慢,不像它可以的那样最新型,也不像它应该的那样安全。</p> <p>  自从读了2007年5月和6月Rodney Landrum在<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志上发表的关于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>集成服务(SSIS)和<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员知识库(DBA Repositories)的文章,我知道是时候采取别人的解决方法了。这对于我的环境来说是完美的,而一些改动也是容易采纳的。</p> <p>  2008年2月,一篇后续文章在<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志上发表,在这篇文章里,Rodney更新了他的解决方法。我下载了代码,在我的测试环境里审核,并迅速把它纳入产品中。当大家普遍地为这个解决方法所提供的而感到高兴时,在它包中缺少的一方面是把<a href="http://www.webjx.com/database/"><u>数据库</u></a>关联到应用程序的能力。</p> <p>  通过在他的解决方法中增加两张额外的表,我可以在我的“土生土长”元<a href="http://www.webjx.com/database/"><u>数据库</u></a>中增加应用程序元数据到我现在使用的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>杂志的方法中。</p> <p>  增加到我<a href="http://www.webjx.com/database/"><u>数据库</u></a>中的应用元数据包括创建两张表:dbo.Applications,专为存储所有程序的应用名称,而这些程序在我的环境中依赖于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>,还有</p> <p>  dbo.Database_Applications,它保存<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> 实例、<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>和应用程序之间的关系。</p> <p>  Applications Table CREATE TABLE [dbo].[Applications] (</p> <p>  [AppID] [int] IDENTITY(154,1) NOT NULL,</p> <p>  [ApplicationName] [varchar](100) NOT NULL, )</p> <p>  Database_Applications Table</p> <p>  CREATE TABLE [dbo].[Database_Applications] (</p> <p>  [DB_AppID] [int] IDENTITY(1,1) NOT NULL,</p> <p>  [<a href="http://www.webjx.com/server/"><u>Server</u></a>Name] [varchar](50) NOT NULL,</p> <p>  [DatabaseName] [varchar](100) NOT NULL,</p> <p>  [ApplicationName] [varchar](100) NULL )</p> <p>  你可能注意到,我没有规范化dbo.Database_Applications表。如果我规范化,我会只存储两个区域:一个与存储我的应用元数据的表有关的外键,和一个与我的元<a href="http://www.webjx.com/database/"><u>数据库</u></a>相对应的外键。我有自己的原因:</p> <p>  我没有处理大量的数据:我有大概800个<a href="http://www.webjx.com/database/"><u>数据库</u></a>,这些<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>在我的环境里发布80个实例。虽然这对于一个<a href="http://www.webjx.com/database/"><u>数据库</u></a>管理员来说是个很大的环境,但是它既不转变成在我的元数据表里的大量纪录,也不转变成<a href="http://www.webjx.com/database/"><u>数据库</u></a>的巨大字节。</p> <p>  不是通过dbo.Applications表的主键,而是包含表中的应用程序名,我可以通过只访问dbo.Database_Applications表产生我的主要应用程序元数据报告(key Application Metadata report)。</p> <p>  我的环境中的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a>元<a href="http://www.webjx.com/database/"><u>数据库</u></a>使用“焦土政策”人口处理方法,除了<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Agent Job History和Backup History,其他的表都被每天删除和重新载入。我发现在</p> <p>  dbo.Database_Applications表中保存信息可以使我的生活变得很容易。</p> <p>  每日从我的环境中载入数据后,我可以通过以下脚本得到在我的环境中产生的任何新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>的良好的陈述。</p> <p>  SELECT D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>], D.DatabaseName FROM dbo.Databases D LEFT JOIN dbo.Database_Applications DA ON D.DatabaseName = DA.DatabaseName AND D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>] = DA.[<a href="http://www.webjx.com/server/"><u>Server</u></a>Name] WHERE DA.DB_AppID IS NULL ORDER BY D.[<a href="http://www.webjx.com/server/"><u>Server</u></a>], D.DatabaseName 这个查询的结果提供任何<a href="http://www.webjx.com/database/"><u>数据库</u></a>的清单,这些<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>产生于上次我更新应用元数据和服务器时,它不仅是跨域的<a href="http://www.webjx.com/database/"><u>数据库</u></a>创建活动的通知,也是致力于更新两个<a href="http://www.webjx.com/database/"><u>数据库</u></a>来符合应用程序信息的数据清单。这个查询也适合<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a> Reporting Services报告的数据表,而当我不在办公室时,<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a> Reporting Services报告也为我提供了一个新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>到我的黑莓(BlackBerry)的日常通知。</p> <p>  最后,我创建了以下存储程序,由此用任何新的<a href="http://www.webjx.com/database/"><u>数据库</u></a>信息来合并dbo.Applications表和dbo.Database_Applications 表。它接受三个参数:服务器,<a href="http://www.webjx.com/database/"><u>数据库</u></a>和应用程序。如果应用程序已经不存在于dbo.Applications表中,它就会被补充。然后一个记录被插入到服务器/<a href="http://www.webjx.com/database/"><u>数据库</u></a>/应用程序关系中的dbo.Applications表。</p> <p>  CREATE PROCEDURE [dbo].[pAdd_Application]</p> <p>  @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name varchar(50),</p> <p>  @DatabaseName varchar(100),</p> <p>  @ApplicationName varchar(100)</p> <p>  AS --Add any new databases created,</p> <p>  but not recorded in the repository, to the repository</p> <p>  UPDATE dbo.Database_Applications</p> <p>  SET ApplicationName = @ApplicationName</p> <p>  WHERE <a href="http://www.webjx.com/server/"><u>Server</u></a>Name = @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name</p> <p>  AND DatabaseName = @DatabaseName</p> <p>  AND ApplicationName IS NULL</p> <p>  --Determine if there is already an application</p> <p>  for this database in the repository, if not, then add it</p> <p>  IF (SELECT COUNT(*) FROM dbo.Applications</p> <p>  WHERE ApplicationName = @ApplicationName) = 0</p> <p>  BEGIN INSERT INTO dbo.Applications (ApplicationName)</p> <p>  VALUES (@ApplicationName)</p> <p>  PRINT 'Added new Application: '</p> <p>  + @ApplicationName + ' to Applications table'</p> <p>  SELECT * FROM dbo.Applications</p> <p>  WHERE ApplicationName = @ApplicationName</p> <p>  END --List the new record in the repository</p> <p>  SELECT <a href="http://www.webjx.com/server/"><u>Server</u></a>Name, DatabaseName, ApplicationName</p> <p>  FROM dbo.Database_Applications</p> <p>  WHERE <a href="http://www.webjx.com/server/"><u>Server</u></a>Name = @<a href="http://www.webjx.com/server/"><u>Server</u></a>Name</p> <p>  AND DatabaseName = @DatabaseName</p> <p>  AND ApplicationName = @ApplicationName</p> <p>  虽然我可以很容易地把这个存储程序的执行整合为<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a>集成服务(SSIS)程序包中的最后一步,而这个程序包能够组装我的存储<a href="http://www.webjx.com/database/"><u>数据库</u></a>,但我选择不这样做,这是为了在我的环境里,我能密切关注围绕新的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> <a href="http://www.webjx.com/server/"><u>Server</u></a><a href="http://www.webjx.com/database/"><u>数据库</u></a>创造而展开的活动。</p>