出于审计目的,我使用触发器将更改插入到审计表中。然后我使用CTE递归获取特定项目的所有审计行。
这个SQLFiddle添加了一些审核行和我正在使用的CTE。
这是CTE:
;WITH cteAudit AS
(
SELECT id, [user_name], date_time, item_parent_type, item_parent_id,
item_type, item_id, item_action, row_guid, 1 AS audit_level
FROM audit
WHERE
(item_type = 22 AND item_id = 925)
UNION ALL
SELECT a.id, a.[user_name], a.date_time, a.item_parent_type, a.item_parent_id,
a.item_type, a.item_id, a.item_action, a.row_guid, cteAudit.audit_level + 1
FROM audit a
INNER JOIN cteAudit
ON a.item_parent_id = cteAudit.item_id
AND a.item_parent_type = cteAudit.item_type
WHERE
a.item_parent_type <> a.item_type AND
a.item_parent_id <> a.item_id
)
SELECT
cteAudit.id,
cteAudit.[user_name],
cteAudit.date_time,
cteAudit.item_parent_id,
@itemtype AS item_type,
cteAudit.item_id,
item_action,
cteAudit.audit_level,
CONVERT(nvarchar(36), cteAudit.row_guid) AS row_guid
ORDER BY date_time DESC, audit_level desc
然而,有了这个CTE,我有两个问题:
这是因为我修改了第3级(联系人),并且此级别有第2级链接(联系人列表。但是第2级,其中包含到第1级(客户)的链接)未被修改,因此不在审计表中,因此没有第一级的链接。
如何返回主表的所有行?为什么查询会返回重复的行?
答案 0 :(得分:0)
您的问题来自不正确的查询或不正确的数据。
您要求递归查询这些约束:
WHERE
a.item_parent_type <> a.item_type AND
a.item_parent_id <> a.item_id
但是对于第11行,第13行,item_parent_id
等于item_id
你也要求
AND a.item_parent_type = cteAudit.item_type
但对于第11-13行,您的类型会被翻转,因此不正确。