CTE를 사용하여 db의 테이블에 대한 감사 레코드를 검색합니다. 고객의 테이블에 대한CTE 곱한 레코드가 반환되었습니다.
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
)
엔트리는 각각 table_name
및 table_id
로 설정 parent_table
및 parent_id
열이됩니다
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,
);
내 감사 테이블이있다 : 예를 들어, 나는 다음과 같은 테이블이있다. 작업의 삽입, 업데이트 또는 삭제에 대한 I, U, D 값을 가질 수 있습니다. 나는 고객이 자신의 주문 및 주문 행을 추가, 그래서
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
:
내 CTE이있다. 행동은 모든 기록에 대한 것입니다. 감사 cte 레코드를 올바르게 검색합니다. 작업 U가있는 고객에 대해 단 하나의 감사 레코드 만 추가하면 반환되는 레코드는 두 배가됩니다.
cte는 고객 및 관련 테이블에 대한 모든 감사 레코드를 반환해야합니다.
이 SQLFiddle에 문제가 있습니다.
여기에 뭔가가 있습니까?
이 cte와 관련된 다른 테이블 구조를 공유 할 수 있습니까? –