Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-架构/代码分析规则-您的规则包括哪些?_Sql_Sql Server_Tsql_Code Analysis - Fatal编程技术网

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

SQL Server-架构/代码分析规则-您的规则包括哪些?,sql,sql-server,tsql,code-analysis,Sql,Sql Server,Tsql,Code Analysis,我们正在使用VisualStudioDatabaseEdition(DBPro)来管理我们的模式。这是一个很好的工具,在它可以做的许多事情中,它可以根据规则分析我们的模式和T-SQL代码(很像FxCop对C#代码所做的),并将某些事情标记为警告和错误 一些示例规则可能是,每个表必须有一个主键,列名中不能有下划线,每个存储过程必须有注释等 DBPro中内置的规则数量相当少,而且有点奇怪。幸运的是,DBPro有一个API,允许开发人员创建自己的API。我很好奇您和您的DB团队将创建哪些类型的规则(模

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

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

DBPro中内置的规则数量相当少,而且有点奇怪。幸运的是,DBPro有一个API,允许开发人员创建自己的API。我很好奇您和您的DB团队将创建哪些类型的规则(模式规则和T-SQL规则)。看看你的一些规则可能会帮助我们决定我们应该考虑什么。< /P>
谢谢-兰迪

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

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

我怀疑我的列表中的大部分内容很难放入规则引擎,但下面是:

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

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

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

我想知道所有需要但没有默认值的字段。根据它是什么,您可能不想定义默认值,但我希望能够很容易地看到哪些不需要,希望找到应该有默认值的

我希望检查所有触发器,以确定它们是基于设置的,而不是设计为一次运行一行

没有定义了唯一索引或主键的表。PK不止一个字段的表。没有PK不是整数的表

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

没有名称中包含单词Date的字段未定义为Date或datetime

没有没有没有关联审核表的表

没有未加密的名为SSN、SocialSecurityNumber等的字段。对于任何名为CreditCardNumber的字段都相同

没有用户定义的数据类型(至少在SQL Server中,这些数据类型的麻烦远大于它们的价值。)

没有调用其他视图的视图。经验告诉我,这些往往是一场等待发生的性能灾难。尤其是如果它们的分层深度超过一层

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

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

在命名中一致使用相同的大小写。只要所有人都使用同一个,使用哪一个并不重要

没有包含ID字段的表。非常讨厌这些。它们真没用。如果是PK,则ID字段应命名为tablenameID;如果是FK,则ID字段应命名为PK名称

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

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

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

我希望能够检查是否有多个语句导致数据库中的操作(insert/update/delete),进程中是否也有显式事务和错误捕获,以便在任何部分失败时回滚整个过程

我相信我还能想到更多