【发布时间】:2014-11-03 12:24:48
【问题描述】:
我使用 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
)
customers 表的条目还将将 parent_table 和 parent_id 列分别设置为 table_name 和 table_id。 Action 可以具有 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 相关的其他表结构?
标签: sql sql-server common-table-expression