【问题标题】:SQL Server - Schema/Code Analysis Rules - What would your rules include?SQL Server - 架构/代码分析规则 - 您的规则包括哪些内容?
【发布时间】:2010-04-23 15:43:26
【问题描述】:

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

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

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

谢谢 - 兰迪

【问题讨论】:

    标签: sql sql-server tsql code-analysis


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      如果可能的话,我会让它报告任何定义为比可以存储在记录(不包括 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 的输入位变量(如果 Debug 变量设置为 1,则代码只打印动态 SQl 语句而不执行它) .

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

      我相信我能想到更多。

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多