在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表。我们想为数据库表和列再创建两个外键。由于“ 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,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添加到“产品”表中(如果您可以强制用户一次验证所有属性),或者为每个已验证的字段创建单独的列列(例如,“椅子”表中的LegsVerifiedBy和LegsVerificationDate,“沙发”表中的ExtendableVerifiedBy和ExtendableVerificationDate等),如果确实需要为每个列分别进行验证。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...