簡體   English   中英

SQL Server:JSON 審計

[英]SQL Server: JSON Auditing

我正在嘗試使用觸發器構建審計策略。 我最初嘗試過這個:

基於觸發器的變更數據捕獲

它工作得很好:它生成了一個格式很好的 JSON,看起來像這樣:

{
    "columns" :[
     { 
        "name": "ID",
        "value:" : {
          "old": "1",
          "new": "2"
        }
     },
     {
        "name": "ModifiedOn",
        "value:" : {
          "old": "2020-02-14 16:00:00",
          "new": "2020-02-15 13:00:00"
        }
     } 
    ]
}

它甚至列出了更新觸發器中更新了哪些列。 它運行良好 - 直到系統達到負載。 因為觸發器從系統表中選擇信息,它幾乎會因為死鎖而降低性能。

我修改了腳本以包含 NOLOCK 提示,但我也使用了 EF Core 的批量上傳庫; 它使用臨時表,並在技術上“修改”了架構 - 所以我仍然遇到了 sch-s 和 sch-m 鎖的死鎖。

我修改了腳本以簡單地選擇插入/刪除到審計表中的值,但它更難閱讀。

以下(也可以在 SO 上找到)讓我很接近:

SELECT [name] = b.[key],
VALUE = CAST(b.[value] as NVARCHAR(MAX))
FROM inserted i,
cross apply
(SELECT * FROM OPENJSON((SELECT * FROM INSERTED FOR JSON PATH,
     WITHOUT_ARRAY_WRAPPER))) B
FOR JSON PATH

但它只從第一行獲取值。

有沒有人做過類似的事情?
如有必要,如果我必須對列進行“硬編碼”,我可以讓腳本生成語句。

謝謝。

declare @inserted table
(
id int primary key clustered,
colA int,
colB varchar(10),
colC uniqueidentifier,
colD date
)

insert into @inserted(id, ColA, colB, colC, colD)
values
(1, 100, 'ABC', newid(), getdate()),
(2, 200, 'DEF', newid(), getdate()),
(3, 300, 'KLM', newid(), getdate()),
(4, 400, 'XYZ', newid(), getdate());


select id, (select i.* for json path) as thejson
from @inserted as i;



declare @deleted table
(
id int primary key clustered,
colA int,
colB varchar(10),
colC uniqueidentifier,
colD date
)

insert into @deleted(id, ColA, colB, colC, colD)
values
(1, 100, 'ABC', newid(), getdate()),
(2, 200, 'DEF', newid(), getdate()),
(3, 300, 'KLM', newid(), getdate()),
(4, 400, 'XYZ', newid(), getdate());


select 
    [name] = o.[key],
    VALUE = CAST(o.[value] as NVARCHAR(MAX))
from
(
select (select d.* for json path, WITHOUT_ARRAY_WRAPPER) as thejson
from @deleted as d
) as src
cross apply openjson(src.thejson) as o;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM