繁体   English   中英

在 MS SQL 中验证数据正确性的最佳实践

[英]Best practice for verifying correctness of data in MS SQL

我们有多个包含不同数据(例如质量、高度、宽度等)的表格需要员工验证。 为了跟踪已验证的数据,我们正在考虑设计下表:

TableName varchar
ColumnName varchar
ItemID varchar
VerifiedBy varchar
VerificationDate date

此表链接将要验证的不同产品 ID、表和列,例如:

Table dbo.Chairs
Column dbo.Chairs.Mass
ItemId 203
VerifiedBy xy
VerificationDate 10.09.2020

在创建外键时,我们能够将 ItemID 链接到中央 ProductsID-Table。 我们想为数据库表和列再创建两个外键。 我们无法做到这一点,因为“sys.tables”和“INFORMATION_SCHEMA.COLUMNS”是视图。

如何为可用的数据库表/列创建外键? 有没有更好的方法来进行这样的数据验证?

谢谢。

您可以添加一个CHECK约束来验证在列 TableName 和 ColumnName 中插入/更新的数据的正确性,如下所示:

CREATE TABLE Products (
    ItemID VARCHAR(10) PRIMARY KEY,
    ItemName NVARCHAR(50) UNIQUE
)

CREATE TABLE Chairs (
    ItemID VARCHAR(10) PRIMARY KEY,
    FOREIGN KEY (ItemID) REFERENCES dbo.Products,
    Legs TINYINT NOT NULL
)

CREATE TABLE Sofas (
    ItemID VARCHAR(10) PRIMARY KEY,
    FOREIGN KEY (ItemID) REFERENCES dbo.Products,
    Extendable BIT NOT NULL
)

CREATE TABLE Verifications (
    TableName sysname NOT NULL,
    ColumnName sysname NOT NULL,
    ItemID VARCHAR(10) REFERENCES dbo.Products,
    VerifiedBy varchar(30) NOT NULL,
    VerificationDate date NOT NULL,
    CHECK (COLUMNPROPERTY(OBJECT_ID(TableName),ColumnName,'ColumnId') IS NOT NULL)
)

您需要将表上的VIEW DEFINITION授予有权插入/更新数据的用户。

这不会完全防止错误数据,因为在删除表或列时不会验证检查约束。

但是,我认为这不一定是个好主意。 更好(也更传统)的方法是将VerifiedByVerificationDate添加到 Products 表中(如果您可以强制用户一次验证所有属性)或针对每个已验证的列创建单独的列(例如 LegsVerifiedBy 和 LegsVerificationDate in Chairs 表、Sofas 表中的 ExtendableVerifiedBy 和 ExtendableVerificationDate 等),如果确实需要对每一列分别进行验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM