使用SQL进行数据库一致性检查

使用SQL进行数据库一致性检查,sql,sql-server,database,validation,stored-procedures,Sql,Sql Server,Database,Validation,Stored Procedures,我有下一个问题: 系统中的数据库具有非规范化的表,在数据库中的几乎每个表上都有“CompanyID”字段。这样做是出于业务规则的目的,应该是这样。有时数据不一致,因为CompanyID==1的客户的订单CompanyID==2 我的建议是编写专门的存储过程,每隔一段时间就会触发一次,并分析此属性上的一些基本“关系链”(这意味着具有某个公司ID的客户应该始终只有来自同一个公司ID的订单,而后者有具有相应公司ID的文章) 问题: SQL中有没有通用的方法来获取具有字段CompanyID的表,然后检查

我有下一个问题:

系统中的数据库具有非规范化的表,在数据库中的几乎每个表上都有“CompanyID”字段。这样做是出于业务规则的目的,应该是这样。有时数据不一致,因为CompanyID==1的客户的订单CompanyID==2

我的建议是编写专门的存储过程,每隔一段时间就会触发一次,并分析此属性上的一些基本“关系链”(这意味着具有某个公司ID的客户应该始终只有来自同一个公司ID的订单,而后者有具有相应公司ID的文章)

问题:

SQL中有没有通用的方法来获取具有字段CompanyID的表,然后检查它们的一致性?这个问题还有其他解决办法吗

我使用以下SQL获取具有给定列名的表:

select column_name, c.is_nullable, c.table_schema, c.table_name, t.table_type, t.table_catalog, * 
from information_schema.columns c join information_schema.tables t 
on c.table_schema = t.table_schema and c.table_name = t.table_name 
where column_name = 'CompanyID' 
and table_type not in ('VIEW') 
and t.table_name not like 'MsMerge%' 
order by ordinal_position
之后,我想用外键遍历关系树,以检查CompanyID参数的相等性

查询示例:

lets say these are our tables:
create table customer(
id int, 
companyID int
)

create table orders (
orderId int, 
customerid int, 
companyID int --"wrong column"
)
您应该执行以下查询:

update orders
set companyID=(select companyID from customer where id=customerid)
要更正数据,还要消除表订单上列companyID的所有用法

如果您有大量发生这种情况的地方,并且希望创建一种自动运行上述查询的方法,您可以在表
sys.columns
中查找列companyID,从中获取表名,并构建一个循环来生成查询

编辑(根据您对评论的回答):

因此,逻辑基本相同。 循环遍历sys.columns表,以获取该列出现的表以及每个表的运行:

select * 
from orders o
where companyID != (select companyID from customer where id=customerid)

我不会通过每分钟运行一次的通用sql来实现这一点——对于大型数据库来说,这会导致性能下降

相反,您可以对每个受影响的表使用Insert/Update触发器,您可以这样编码:

CREATE TRIGGER chk_tablename
ON T1 tablename 
FOR INSERT,UPDATE
AS
BEGIN

  // Your checks are here
  // Log inconsistent data

END

什么是关系数据库管理系统?神谕sql server?postgresql?mysql?业务规则不确定非规范化,因为非规范化模式的整个要点是它与规范化模式持有相同的数据,但格式可以更快地访问;尽管这样做的代价是维护数据完整性的难度增加——如图所示。问题是,我不想更正数据,我只想检测这种不一致性,并返回带有记录主键的表名,这将发现问题,并让我稍后决定如何处理此数据。是的。说得好。应该和我的团队讨论一下。比起让存储过程执行一些奇怪的逻辑,我更喜欢它。