我使用CTE检索我的数据库中的任何表的审计记录。例如,我有如下表:CTE乘以记录返回
CREATE TABLE [customers]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NULL
);
CREATE TABLE [customers_orders]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[customer_id] [int] NOT NULL,
[date_time] [datetime] NULL DEFAULT (getdate())
);
CREATE TABLE [customers_orders_lines]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[order_id] [int] NOT NULL,
[quantity] [int] NULL,
);
我的审计表是这样的:
CREATE TABLE [audit]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[user_name] [varchar](50) NULL,
[date_time] [datetime] NULL DEFAULT (getdate()),
[parent_table] [varchar](50) NULL,
[parent_id] [int] NULL,
[table_name] [varchar](50) NULL,
[table_id] [int] NULL,
[action] [varchar](1) NULL
)
为客户表的条目也将有parent_table
和parent_id
列分别设置为table_name
和table_id
。动作可以具有插入,更新或删除的I,U,D的值。
我的CTE是这样的:
DECLARE @tablename varchar(100)
SET @tablename = 'customers'
DECLARE @tableid int
SET @tableid = 100
;WITH cteAudit AS
(
SELECT id, [user_name], date_time, table_name, table_id, action, 1 AS audit_level
FROM audit
WHERE
table_name = @tablename AND
table_id = @tableid
UNION ALL
SELECT a.id, a.[user_name], a.date_time, a.table_name, a.table_id, a.action, cteAudit.audit_level + 1
FROM audit a
INNER JOIN cteAudit
ON a.parent_id = cteAudit.table_id
AND a.parent_table = cteAudit.table_name
WHERE
a.parent_table <> a.table_name AND
a.parent_id <> a.table_id
)
SELECT * FROM cteAudit ORDER BY date_time DESC, id_no, audit_level
所以,我添加了一个客户,他的订单和订单行。行动是我为所有记录。 Audit cte正确地检索记录。当我为添加行动U的客户添加1条审计记录时,返回的记录翻倍。
cte应返回客户和相关表的所有审核记录。
这个SQLFiddle显示了这个问题。
我在这里错过了什么吗?
请问您能分享一下与此cte相关的其他表结构吗? – 2014-11-02 08:04:07