SQL Server - 架构/代码分析规则 - 您的规则包含哪些内容?

时间:2010-04-23 15:43:26

标签: sql sql-server tsql code-analysis

我们正在使用Visual Studio Database Edition(DBPro)来管理我们的架构。这是一个很棒的工具,它可以做很多事情,可以根据规则分析我们的模式和T-SQL代码(很像FxCop对C#代码的作用),并将某些事情标记为警告和错误。

一些示例规则可能是每个表必须有一个主键,列名中没有下划线,每个存储过程都必须有注释等。

DBPro中内置的规则数量相当少,有点奇怪。幸运的是,DBPro有一个允许开发人员创建自己的API。我很好奇您和您的数据库团队将创建的规则类型(架构规则和T-SQL规则)。查看一些规则可能有助于我们决定应该考虑什么。

谢谢 - 兰迪

2 个答案:

答案 0 :(得分:1)

我的一些人。并非所有都可以通过编程方式进行测试:

  • 没有匈牙利风格的前缀(如表格为“tbl”,视图为“vw”)
  • 如果有可能将其移植到Oracle,则不会有超过30个字符的标识符。
  • 所有表格和列名称仅以小写字母表示
  • 列名和表名中单词之间的下划线 - 我们明显区别
  • 表名是单数(“客户”而不是“客户”)
  • 构成表,列和视图名称的单词不是缩写,连接或基于首字母缩写词的,除非必要。
  • 索引的前缀为“IX _”。
  • 主键的前缀为“PK _”。
  • 外键带有“FK _”前缀。
  • 唯一约束以“UC _”为前缀。

答案 1 :(得分:1)

我怀疑我的大部分列表都很难放入规则引擎,但是这里有:

如果可能的话,我会报告任何定义为比可以存储在记录中的字节(不包括varchar(max)和文本类型字段)和/或数据页面更宽的表。

如果可能的话,我希望所有相关的PK和FK列具有相同的名称。唯一不可能的是当你需要在同一个表中有两个与一个PK相关的FK时,即便如此,我会将它命名为PK的名称和描述差异的前缀或后缀。例如,如果我有一个PersonID PK和一个需要同时具有销售代表ID和客户ID的表,那么它们将是CustomerPersonID和RepPersonID。

我会检查以确保所有FK都有索引。

我想知道所有必需的字段,但没有默认值。根据它的不同,您可能不想定义默认值,但我希望能够轻松地看到哪些不希望找到应该有默认值的那些。

我希望检查所有触发器,看它们是基于集合的,而不是设计为一次运行一行。

没有定义唯一索引或PK的表。没有PK表不止一个字段的表。没有PK不是int的表。

没有对我正在使用的数据库使用保留字的对象名称。

没有字段作为名称的一部分,未定义为日期或日期时间。

没有相关审核表的表。

没有加密的字段称为SSN,SocialSecurityNumber等。任何名为CreditCardNumber的字段都相同。

没有用户定义的数据类型(至少在SQL Server中,这些数据类型远比它们值得多。)

没有调用其他视图的视图。经验告诉我,这些往往是等待发生的性能灾难。特别是如果它们层叠多层。

如果使用复制,则没有没有GUID字段的表。

所有表都应该有一个DateInserted字段和InsertedBy字段(即使有审计,如果这些信息很容易获得,通常也更容易研究数据问题。)

在命名中一致使用相同的案例。只要所有人都使用同一个,这并不重要。

没有名为ID的字段的表格。讨厌这些充满激情。他们是如此无用。如果是PK,则ID字段应命名为tablenameID,如果为FK,则应将其命名为PK名称。

对象名称中没有空格或特殊字符。换句话说,如果您需要对数据库进行特殊处理以在查询中的正确上下文中识别它,请不要使用它。

如果要分析代码,我还是希望看到任何使用游标或相关子查询的代码。为什么从一开始就产生性能问题?

我想查看一个proc是否使用动态SQl,如果是,如果它有一个名为Debug的输入位变量(并且代码只打印动态SQl语句而不执行它,如果Debug变量设置为1) 。

我希望能够检查是否有多个语句导致数据库中的操作(插入/更新/删除),在proc中还有一个显式事务和错误捕获以滚动整个事物如果它的任何部分失败了。

我相信我能想到更多。