[英]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
授予有权插入/更新数据的用户。
这不会完全防止错误数据,因为在删除表或列时不会验证检查约束。
但是,我认为这不一定是个好主意。 更好(也更传统)的方法是将VerifiedBy
和VerificationDate
添加到 Products 表中(如果您可以强制用户一次验证所有属性)或针对每个已验证的列创建单独的列(例如 LegsVerifiedBy 和 LegsVerificationDate in Chairs 表、Sofas 表中的 ExtendableVerifiedBy 和 ExtendableVerificationDate 等),如果确实需要对每一列分别进行验证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.