你如何记录你的数据库?


202

我发现我的大多数客户都没有记录他们的数据库,我发现这很可怕。为了介绍一些更好的实践,我想知道人们正在使用什么工具/流程。

  • 你如何记录你的数据库?(SQL服务器)
  • 你用什么工具?
  • 文档存储数据库模式/元数据的格式?
    • Word文档
    • Excel电子表格
    • 纯文本
  • 文档流程或政策?

我不是在谈论逆向工程/文档现有数据库,而是在开发系统/数据库时主要关注文档最佳实践。

+3

@TML:数据库文档*应该如何*,您可以阅读Lex de Haan和Toon Koppelaars的[数学专业应用数学](http://apress.com/book/view/1590597451)(顺便说一下非常好的书,带有误导性的标题),但我怀疑(m)任何人这样做。 18 1月. 112011-01-18 15:32:06

64

我一直在使用扩展属性,因为它们非常灵活。大多数标准文档工具可以通过MS_Description驱动,然后您可以使用自己的定制工具。

见演讲: #41-Get a Lever and Pick Any Turtle: Lifting with Metadata

此代码: http://code.google.com/p/caderoux/wiki/LeversAndTurtles

+2

您可以更改某些内容并忘记相应地更改扩展属性,从而使其不正确。你能自动发现这种差异吗? 25 3月. 132013-03-25 00:43:35

+1

至少,可以查询数据库模式(sys.tables/sys.columns)并将其连接到其扩展属性(sys.extended_properties)以识别未记录的字段,然后将该脚本转换为在部署时运行的测试。 18 2月. 162016-02-18 21:11:31


17

如果它曾经写过,那么文档包含一个word文档。将包括几个关系图。表的列表以及每个表所包含内容的简要说明以及它与其他表的关系。文档的一章包括安全设置:应用程序需要“用户”的权限是什么?

通常,在我工作过的公司中,只有当客户是执行审计的客户才会编写数据库文档,而这往往会限制其对金融和政府客户的使用。

免责声明:太多的开发人员采取的态度是代码是文档 ,我也对此感到内疚。

+9

我发现文档中没有与代码紧密相关的一个大问题(例如,单独的Word文档,而不是自动生成的架构图+命名良好的数据库对象),这个文档保证是错误的,因为时间流逝。原因很简单:单独的文档有效地复制了信息。没有*自动*方式使其与源同步,它将很快过时。将其与从数据库中生成架构图的工具进行比较,并从代码中提取相应的注释。 19 8月. 112011-08-19 20:24:40


50

微软的Visio Pro (直到Visio 2010)可以像CA的ERwin那样对数据库进行逆向工程。Visio是更便宜的选择,但ERwin是更详细,更完整的选择。如果人们费心去看它们,扩展属性很好。您还可以使用Red Gate的SQL Doc之类的SQL Doc输出HTML格式的文档。

我发现命名约定和正确设置外键导致几乎自我记录数据库。你仍然应该有一些外部文档来更好地理解目的。

  0

通常缺少一个简单的模式(即使在一个命名良好的外键数据库中)也是字段的描述。根据我的经验,让所有字段都足够简单以适应列名称是不寻常的。 17 5月. 162016-05-17 19:54:18


21

试试SchemaSpy: http://schemaspy.sourceforge.net/


18

看看SchemaCrawler - 这是我设计的免费命令行工具, SchemaCrawler您的需求。SchemaCrawler生成包含所有数据库模式对象的文本文件。此文本输出设计为人类可读,并且与另一台服务器的类似输出不同。

在实践中,我发现,当作为构建的一部分完成时,输出数据库模式的文本文件是有用的。这样,您可以将文本文件检查到源代码控制系统中,并获得模式随时间演变的版本历史记录。SchemaCrawler也可以从命令行自动执行此操作。


10

有趣的是,我想知道其他人是如何做到这一点的..

在开发我的第一个大数据库项目时,我发现Microsoft SQL Server Management Studio 10.0.1600.22支持数据库图表,您可以将其导出到word文档或其他文档软件,您可以在其中添加尽可能多的文档详细信息。只需在SQL Management Studio上展开您连接的数据库,右键单击对象资源管理器中的“数据库图表”,然后选择“新数据库图表”以生成交互图,该图将显示不同表之间的所有关系。您甚至可以指定要在图表中包含哪些表格,这样如果您只想逐个记录图像,图像就不会非常不合适。将图像导出到任何其他编辑软件并根据需要进行注释。

我还建议在生成数据库的脚本中有大量的/comments /。

一般来说,写下它的全部内容是很多工作,但从长远来看这是一个好主意,例如当你或其他一些可怜的灵魂回来更新你的创作几年后!:)

+1

我没有使用SQL Server图,因为外键约束只是连接到表的某个地方,就像在[ER-diagrams]中完成的那样(https://en.wikipedia.org/wiki/Entity%E2%80 %93relationship_model)。我更喜欢连接主键和外键字段的连接器。 15 7月. 162016-07-15 11:43:39


19

对于SQL Server,我使用的是扩展属性。

使用以下PowerShell脚本,我可以为单个表或dbo架构中的所有表生成Create Table脚本。

该脚本包含Create table命令,主键和索引。将外键添加为注释。表和表列的扩展属性将作为注释添加。是支持多行属性。

脚本调整为我的个人编码风格。

  • 单列没有单独的排序规则。

  • 目前它需要Sql ServerAuthentication。

下面是将扩展属性转换为一个好的普通旧ASCII文档的完整代码(顺便说一句,它是有效的sql来重新创建表):

function Get-ScriptForTable
{
   param (
    $server,$ dbname,
    $user,$ password,
    $filter
   )

[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | out-null$ conn = new-object "Microsoft.SqlServer.Management.Common.ServerConnection" 
 $conn.ServerInstance =$ server
 $conn.LoginSecure =$ false
 $conn.Login =$ user
 $conn.Password =$ password
 $conn.ConnectAsUser =$ false
 $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server"$ conn

 $Scripter = new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
#$ Scripter.Options.DriAll = $false$ Scripter.Options.NoCollation = $True$ Scripter.Options.NoFileGroup = $true$ scripter.Options.DriAll = $True$ Scripter.Options.IncludeIfNotExists = $False$ Scripter.Options.ExtendedProperties = $false$ Scripter.Server = $srv$ database = $srv.databases[$ dbname]
 $obj =$ database.tables

 $cnt = 1$ obj | % {

   if (! $filter -or$ _.Name -match $filter)
  {$ lines = @()
    $header = "----------{0, 3}{1, -30}----------" -f$ cnt, $_.Name
    Write-Host$ header 

    "/* ----------------- {0, 3} {1, -30} -----------------" -f $cnt,$ _.Name
    foreach( $i in$ _.ExtendedProperties)
    {
     "{0}: {1}" -f $i.Name,$ i.value
    }
    ""
    $colinfo = @{}
    foreach($ i in $_.columns)
   {$ info = ""
     foreach ( $ep in$ i.ExtendedProperties)
     {
      if ( $ep.value -match "'n")
     {
       "----- Column:{0}{1}-----" -f$ i.name, $ep.name$ ep.value
      }
      else
      {
       $info += "{0}:{1}" -f$ ep.name, $ep.value
      }
     }
     if ($ info)
     {
      $colinfo[$ i.name] = $info
     }
    }
    ""
    "SELECT COUNT(*) FROM{0}" -f$ _.Name
    "SELECT * FROM {0} ORDER BY 1" -f $_.Name
    "---------------------{0, 3}{1, -30}----------------- */" -f$ cnt, $_.Name
    ""$ raw = $Scripter.Script($ _)
    #Write-host $raw$ cont = 0
    $skip =$ false 
    foreach ( $line in$ raw -split "\r\n")
    {
     if ( $cont -gt 0)
    {
      if ($ line -match "^\)WITH ")
      {
       $line = ")"
      }$ linebuf += ' ' + $line -replace " ASC", ""$ cont--
      if ( $cont -gt 0){ continue }
     }
     elseif ($ line -match "^ CONSTRAINT ")
     {
      $cont = 3$ linebuf = $line
      continue
     }
     elseif ($ line -match "^UNIQUE ")
     {
      $cont = 3$ linebuf = $line$ skip = $true
      continue
     }
     elseif ($ line -match "^ALTER TABLE.*WITH CHECK ")
     {
      $cont = 1$ linebuf = "-- " + $line
      continue
     }
     elseif ($ line -match "^ALTER TABLE.* CHECK ")
     {
      continue
     }
     else
     {
      $linebuf =$ line
     }
     if ( $linebuf -notmatch "^SET ")
    {
      if ($ linebuf -match "^\)WITH ")
      {
       $lines += ")"
      }
      elseif ($ skip)
      {
       $skip =$ false
      }
      elseif ( $linebuf -notmatch "^\s*$ ")
      {
       $linebuf =$ linebuf -replace "\]|\[", ""
       $comment =$ colinfo[( $linebuf.Trim() -split " ")[0]]
       if ($ comment) { $comment = ' -- ' +$ comment }
       $lines +=$ linebuf + $comment
      }
     }
    }$ lines += "go"
    $lines += ""$ block = $lines -join "'r'n"$ block
    $cnt++$ used = $false
    foreach($ i in $_.Indexes)
   {$ out = ''
     $raw =$ Scripter.Script( $i)
     #Write-host$ raw
     foreach ( $line in$ raw -split "\r\n")
     {
      if ( $line -match "^\)WITH ")
     {$ out += ")"
      }
      elseif ( $line -match "^ALTER TABLE.* PRIMARY KEY")
     {
       break
      }
      elseif ($ line -match "^ALTER TABLE.* ADD UNIQUE")
      {
       $out +=$ line -replace "\]|\[", "" -replace " NONCLUSTERED", "" 
      }
      elseif ( $line -notmatch "^\s*$ ")
      {
       $out +=$ line -replace "\]|\[", "" -replace "^\s*", "" '
       -replace " ASC,", ", " -replace " ASC $", "" '
       <#-replace "\bdbo\.\b", "" #> '
       -replace " NONCLUSTERED", "" 
      }$ used = $true
     }$ block = " $out;'r'ngo'r'n"$ out
    }
    if ($used)
    {
     "go"
    }
   }
} 
}

您可以编写给定数据库的完整dbo架构的脚本

Get-ScriptForTable 'localhost' 'MyDB' 'sa' 'toipsecret' | Out-File "C:\temp\Create_commented_tables.sql"

或者过滤单个表格

Get-ScriptForTable 'localhost' 'MyDB' 'sa' 'toipsecret' 'OnlyThisTable'

9

我使用扩展属性和Red Gates SQL Doc。效果很好!


7

DB Dictionary Creator

是一个开源数据库文档工具,具有良好的GUI和导出/导入选项。它使用扩展属性来存储文档。它还将生成主键列和外键列的自动描述。

+1

需要.NET Framework 4.0,并且只适用于SQL Server和SQL Express 07 10月. 122012-10-07 15:55:26


9

我使用数据建模工具,因为它们允许我记录有关数据库的重要信息,而不是数据库中“适合”的信息。隐私/安全/敏感性问题,管理,治理等元数据。

这可能超出了记录数据库所需的内容,但这些对于业务很重要并帮助他们管理数据。

正式工具还可以帮助我管理存储在多个数据库/实例/服务器中的数据。这在我们的打包应用程序世界中从未如此真实。


5

实际上,扩展属性(MS_Description)是要走的路。将这些描述作为元数据的一部分随时可用,不仅可以由文档生成器使用,而且(希望有一天)通过提供“intellisense”的工具,例如优秀的Softtree的SQL Assistant http://www.softtreetech.com/isql.htm (上次我检查他们没有)或内置SQL Sever Management Studio的Intellisense(自sql2008起)

我也相信开发人员和DBA应该很容易添加这些笔记,因为正如Tangurena和Nick Chammas正确指出的那样 - 开发人员非常不愿意更新文档并讨厌重复工作 - 这对于被教授的人来说尤其公平在整个职业生涯中优化事物。因此,除非在靠近源代码的地方更新文档非常容易 - 否则这不会起作用。在某些时候,我搜索网络并没有找到解决方案,所以我写了LiveDoco(不是免费的,对不起),试图让它变得简单。如果感兴趣,请在此处获取更多信息: http://www.livedoco.com/why-livedoco


10

我为所有对象设置了MS_description扩展属性,然后使用ApexSQL Doc记录整个数据库。我之前用于创建HTML文档,但最近我更喜欢PDF


5

你也可以看看wsSqlSrvDoc 。这是一个很好的小工具,可以使用SQL Server扩展属性并创建一个MS Word文档。

所有列属性的打印输出(具有外键关系)都是开箱即用的。有关每个字段的进一步说明,您必须在SQL Server Management Studio中设置这些列的扩展属性。

它不是免费的,而是相当实惠的。如果您只需要为“不在进行中”DB创建一个文档,该文档或多或少已完成,而不足以使用免费试用版。

Tool Website


8

对于Documenting sql server,我强烈建议刚刚发布:

SQL Server & Windows Documentation Using Windows PowerShell由Kendal Van Dyke撰写

链接简要说明:

SQL Power Doc是一组Windows PowerShell脚本和模块,用于发现,记录和诊断SQL Server实例及其基础Windows操作系统和计算机配置。 SQL Power Doc适用于从SQL Server 2000到2012的所有SQL Server版本,以及从Windows 2000和Windows XP到Windows Server 2012和Windows 8的所有版本的Windows Server和消费者Windows操作系统.SQL Power Doc还能够记录Windows Azure SQL数据库。


2

我们使用Dataedo来创建数据字典,文档存储过程和函数。我们粘贴在Visio中创建的ERD。所有文档都存储在Dataedo元数据存储库(格式化文本)中,我们将其导出为HTML以供内部使用或导出为PDF以用于打印文档。

我们将每个对象分配给一个模块,并将每个模块分配给一个人。Dataedo附带文档状态报告,因此我们可以判断是否需要记录新的列或表。