如何查询DNN(DotNetNuke)数据库找出近期实际修改的页面
解决DNN中识别实际编辑过的网页问题
我太懂你的困扰了——DNN里的LastModifiedOnDate字段真的很鸡肋,只要点了编辑按钮哪怕半毛钱内容没改,这个字段都会更新,靠它筛选出来的结果完全没法看。要找出真正有内容变更的页面,得从内容的实际差异入手,下面给你几个可行的思路:
1. 对比内容哈希值(推荐方案)
DNN的HtmlText表存储着页面的实际内容(比如Content字段),我们可以给内容生成哈希值,通过对比同一页面的哈希变化来判断是否真的修改过。
具体操作:
如果权限允许,先给
HtmlText表添加一个自动计算哈希的字段:ALTER TABLE HtmlText ADD ContentHash AS HASHBYTES('SHA2_256', Content) PERSISTED;这个字段会自动根据
Content字段生成哈希,只要内容有变动,哈希值就会跟着变。然后用这个哈希值筛选出有实际内容变更的页面:
WITH PageContentHistory AS ( SELECT TabID, ContentHash, LastModifiedOnDate, ROW_NUMBER() OVER (PARTITION BY TabID ORDER BY LastModifiedOnDate DESC) AS RowNum FROM HtmlText WHERE CreatedOnDate >= '2018-01-01' ) SELECT t.TabID, t.TabName, t.TabPath AS PageURL, p.LastModifiedOnDate AS ActualModifiedDate FROM PageContentHistory p JOIN Tabs t ON p.TabID = t.TabID WHERE p.RowNum = 1 -- 取页面的最新版本 AND EXISTS ( SELECT 1 FROM PageContentHistory p2 WHERE p2.TabID = p.TabID AND p2.ContentHash != p.ContentHash ) ORDER BY p.LastModifiedOnDate DESC;这个查询会找出那些至少有两个不同哈希版本的页面,也就是确实有内容变更的页面。
2. 直接对比内容版本(无需修改表结构)
如果没法改表结构,也可以直接对比同一页面的不同版本内容:
WITH PageContentVersions AS ( SELECT TabID, Content, LastModifiedOnDate, LAG(Content) OVER (PARTITION BY TabID ORDER BY LastModifiedOnDate) AS PreviousContent FROM HtmlText WHERE CreatedOnDate >= '2018-01-01' ) SELECT DISTINCT t.TabID, t.TabName, t.TabPath AS PageURL, v.LastModifiedOnDate AS ActualModifiedDate FROM PageContentVersions v JOIN Tabs t ON v.TabID = t.TabID WHERE v.Content != v.PreviousContent AND v.PreviousContent IS NOT NULL -- 排除页面的初始版本 ORDER BY v.LastModifiedOnDate DESC;
这里用LAG函数获取上一个版本的内容,和当前版本对比,不一样的就是真正修改过的页面。
3. 结合编辑日志辅助过滤
DNN的EventLog表会记录系统操作日志,你可以结合这个表过滤那些只打开编辑但没保存的记录:
SELECT t.TabID, t.TabName, t.TabPath AS PageURL, MAX(h.LastModifiedOnDate) AS ActualModifiedDate FROM HtmlText h JOIN Tabs t ON h.TabID = t.TabID JOIN EventLog e ON h.TabID = e.ObjectKey WHERE h.CreatedOnDate >= '2018-01-01' AND e.EventTypeKey = 'CONTENT_EDITED' -- 只保留实际保存编辑的日志 GROUP BY t.TabID, t.TabName, t.TabPath ORDER BY ActualModifiedDate DESC;
不过这个方法依赖DNN的日志配置,如果日志没开或者记录不全,结果可能不准,适合作为辅助手段。
小提醒:不同DNN版本的表结构可能略有差异,比如有些版本的内容表是
HtmlContent而非HtmlText,你可以先确认自己的数据库表名再调整查询。
内容的提问来源于stack exchange,提问作者karlk
相关产品推荐
相关产品推荐

