使用SQL进行数据库一致性检查
我有下一个问题: 系统中的数据库具有非规范化的表,在数据库中的几乎每个表上都有“CompanyID”字段。这样做是出于业务规则的目的,应该是这样。有时数据不一致,因为CompanyID==1的客户的订单CompanyID==2 我的建议是编写专门的存储过程,每隔一段时间就会触发一次,并分析此属性上的一些基本“关系链”(这意味着具有某个公司ID的客户应该始终只有来自同一个公司ID的订单,而后者有具有相应公司ID的文章) 问题: SQL中有没有通用的方法来获取具有字段CompanyID的表,然后检查它们的一致性?这个问题还有其他解决办法吗 我使用以下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的表,然后检查
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?业务规则不确定非规范化,因为非规范化模式的整个要点是它与规范化模式持有相同的数据,但格式可以更快地访问;尽管这样做的代价是维护数据完整性的难度增加——如图所示。问题是,我不想更正数据,我只想检测这种不一致性,并返回带有记录主键的表名,这将发现问题,并让我稍后决定如何处理此数据。是的。说得好。应该和我的团队讨论一下。比起让存储过程执行一些奇怪的逻辑,我更喜欢它。