检索已审核数据更改的历史记录

启用审核后,在已审核的表和列中更改数据时,可以检索这些表和列的更改历史记录。

无法使用 Dataverse TDS (SQL) 终结点访问审核数据。

移动应用中的表不提供审核历史记录。

审核表

审核(Audit)表存储审核事件。 在 Web API 中, audit EntityType 是此数据的资源。 审核表是只读的。

审核表提供了 Power Platform 管理中心中显示的“查看审核摘要”的数据。

确保调用用户具有prvReadAuditSummary权限从表中检索数据。

下表汇总了审核表中的重要列。

SchemaName
逻辑名称
DisplayName
类型 Description
Action
action
Event
选项 表示导致更改的事件。 详细了解操作。
AttributeMask
attributemask
已更改的字段
备忘录 如果更改表示对记录数据的更改,则该值包含与已更改列的 AttributeMetadata.ColumnNumber 对应的、以逗号分隔的数字列表。

注意: 请勿使用此数据。 请改用消息 来检索更改历史记录。
AuditId
auditid
记录 ID
唯一标识符 标识审核表的主键。
CallingUserId
callinguserid
呼叫用户
查找 当操作使用模拟时,标识调用用户;否则为 null。
CreatedOn
createdon
更改日期
日期/时间 标识创建审核记录的时间,即发生用户操作的时间。
2025 年 7 月,此值的精度已提升到包含毫秒。 此更改捕获具有多个操作的事务中的正确审核事件序列。
ObjectId
objectid
记录
查找 唯一标识已审计的记录。
ObjectTypeCode
objecttypecode
实体
实体名称 显示列引用 objectid 的表的逻辑名称。
Operation
operation
运算
选项 标识创建审核记录的操作;四个值之一:
1 = 创建
2 = 更新
3 = 删除
4 = 访问
UserId
userid
更改者
查找 显示更改数据的用户的 ID。

审计操作

使用 操作选项 筛选特定事件。 下表对事件进行分类。

表格行事件

这些事件捕获记录的更改。

Value 标签 消息 Description
1 Create Create 已创建记录。
2 Update Update 记录已更新。
3 删除 Delete 记录已删除。
12 Merge Merge 一条记录与另一条记录合并。
13 分配 Assign 用户拥有的表记录的 ownerid 列值已更改。
41 设置状态 SetState 记录 statecode 的列值已更改。

记录共享事件

这些事件捕获共享记录时记录访问的更改。

Value 标签 消息 Description
14 分享 GrantAccess 用户被授予对某条记录的权限。
48 修改共享设置 ModifyAccess 授予用户的权限已更改。
49 取消共享 RevokeAccess 用户对记录的访问权限已被移除。

多对多关系事件

这些事件捕获多对多关系的更改。

Value 标签 消息 Description
33 关联实体 Associate 一个或多个记录与另一项相关联。
34 解除关联实体 Disassociate 一个或多个记录与另一条记录取消关联。
53 向团队分配角色 Associate 安全角色被分配给一个团队。
54 从团队中删除角色 Disassociate 安全角色已从团队中移除。
55 向用户分配角色 Associate 安全角色已分配给用户。
56 从用户中删除角色 Disassociate 已从用户中移除安全角色。

用户访问事件

这些选项捕获启用用户访问审核时的用户访问历史记录。 这些事件的审核记录的 operation 列值为 4。

Value 标签 Description
64 通过 Web 访问用户 用户正在使用模型驱动应用访问 Dataverse。
65 通过 Web 服务进行访问 用户使用模型驱动应用以外的客户端通过 Web 服务访问 Dataverse。
112 用户访问审核已启动 用户访问审核已开始。
113 用户访问审核已停止 用户访问审计已结束。

示例:审核用户访问演示如何使用这些操作选项来审核用户访问权限。

元数据更改事件

这些事件捕获对表和列定义的更改,以及组织表的更改。

Value 标签 Description
100 删除实体 用户删除了表。
101 删除属性 用户删除了列。
102 实体级别的审核更改 用户更改了表定义以启用或禁用审计。
103 属性级别的更改审计 用户更改了列定义以启用或禁用审计。
104 组织级别的审计更改 用户更改了组织设置。

审核更改事件

这些事件捕获对审计设置的更改。

Value 标签 Description
105 实体审核已启动 为表启用了审计。
106 属性审核已启动 已为列启用审计。
107 审计已启用 已为组织启用审计。
108 实体审核已停止 已对表禁用审计。
109 属性审核已停止 已禁用某个属性的审核。
110 审核已禁用 已对列禁用审计。
111 审核日志删除 一条审核日志被删除了。

安全角色更改事件

这些事件记录对安全角色的更改。

Value 标签 消息 Description
57 将权限添加到角色 AddPrivilegesRole 权限已添加到某个角色。
58 从角色中删除权限 RemovePrivilegeRole 权限已从角色中删除。
59 替换角色中的权限 ReplacePrivilegesRole 角色的权限已被替换。

其他操作

其余操作选项通常是指适用于特定解决方案的可审核操作,例如 Dynamics 365 Sales、Customer Service 和 Marketing。

这些操作的标签应与表示该操作的 SdkMessage.Name 值保持一致。 特定操作可能是操作名称和表的组合。 例如,值为 10 的选项,标签 “关闭 ”应对应于 CloseIncident 或 CloseQuote 消息。

审计表关系

审核表与 systemuser 表只有两个多对一关系:

Relationship 审计表查询 Description
lk_audit_userid userid 将用户与由于所做更改而创建的所有审核记录相关联。
lk_audit_callinguserid callinguserid 将用户与他们在冒充其他用户时创建的任何审核记录相关联。

可以使用这些关系筛选为特定用户创建的审核数据记录。

审核实体仅支持查询中的一个链接实体。 由于表中只存在 systemuser 两种关系,因此可以包含 callinguserid 或 userid 列中的数据,但不能同时包含两者中的数据。

不能使用 QueryExpression 或 FetchXml 生成查询,这些查询将审核数据与除与 systemuser 表存在的两种正式关系之外的其他表联接在一起。

审核 EntityType 定义

通过使用 Web API,可以使用 审计 EntityType 资源从审计表读取数据。 以下数据是 Web API CSDL $metadata服务文档中 的审核 EntityType 定义,不含注释。

<EntityType Name="audit" BaseType="mscrm.crmbaseentity">
  <Key>
      <PropertyRef Name="auditid" />
  </Key>
  <Property Name="operation" Type="Edm.Int32" />
  <Property Name="attributemask" Type="Edm.String" Unicode="false" />
  <Property Name="action" Type="Edm.Int32" />
  <Property Name="useradditionalinfo" Type="Edm.String" Unicode="false" />
  <Property Name="createdon" Type="Edm.DateTimeOffset" />
  <Property Name="objecttypecode" Type="Edm.String" Unicode="false" />
  <Property Name="_callinguserid_value" Type="Edm.Guid" />
  <Property Name="_regardingobjectid_value" Type="Edm.Guid" />
  <Property Name="_objectid_value" Type="Edm.Guid" />
  <Property Name="_userid_value" Type="Edm.Guid" />
  <Property Name="transactionid" Type="Edm.Guid" />
  <Property Name="auditid" Type="Edm.Guid" />
  <NavigationProperty Name="callinguserid" Type="mscrm.systemuser" 
    Nullable="false" Partner="lk_audit_callinguserid">
      <ReferentialConstraint Property="_callinguserid_value" 
        ReferencedProperty="systemuserid" />
  </NavigationProperty>
  <NavigationProperty Name="userid" Type="mscrm.systemuser" 
    Nullable="false" Partner="lk_audit_userid">
      <ReferentialConstraint Property="_userid_value" 
        ReferencedProperty="systemuserid" />
  </NavigationProperty>
</EntityType>

Note

审核 EntityType中不包括ChangeData 列。 请勿使用此数据。 请改用消息 来检索审核更改历史记录。

示例:查找用户删除的联系人记录

以下示例是显示特定用户删除的联系人记录的审核历史记录的查询。

以下两个查询都返回相同的响应。

以下查询按审核记录的 _userid_value 属性进行筛选,其中该属性值与 <user id> 匹配。

请求:

GET [Organization URI]/api/data/v9.2/audits?$select=_objectid_value,objecttypecode,createdon,_userid_value&$orderby=createdon desc&$filter=operation eq 3 and objecttypecode eq 'contact' and _userid_value eq '<user id>'

Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
If-None-Match: null
Prefer: odata.include-annotations="*" 

以下查询从 systemuser 表中访问具有 lk_audit_userid 集合值导航属性的特定用户的审核记录集合,其中 systemuserid 值匹配 <user id>。

请求:

GET [Organization URI]/api/data/v9.2/systemusers(<user id>)/lk_audit_userid?$select=_objectid_value,objecttypecode,createdon,_userid_value&$orderby=createdon desc&$filter=operation eq 3 and objecttypecode eq 'contact'

Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
If-None-Match: null
Prefer: odata.include-annotations="*" 

响应:

HTTP/1.1 200 OK
Preference-Applied: odata.include-annotations="*"

{
  "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#audits(_objectid_value,objecttypecode,createdon,_userid_value)",
  "@Microsoft.Dynamics.CRM.totalrecordcount": -1,
  "@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded": false,
  "value": [
    {
      "_objectid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "contact",
      "_objectid_value": "0e76dc8a-41b5-ec11-983f-0022482bf046",
      "objecttypecode@OData.Community.Display.V1.FormattedValue": "Contact",
      "objecttypecode": "contact",
      "createdon@OData.Community.Display.V1.FormattedValue": "5/12/2022 3:19 PM",
      "createdon": "2022-05-12T22:19:12Z",
      "_userid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "systemuser",
      "_userid_value@OData.Community.Display.V1.FormattedValue": "FirstName LastName",
      "_userid_value": "4026be43-6b69-e111-8f65-78e7d1620f5e"
    },
    < Other results truncated for brevity>
  ]
}

检索审计更改历史记录

若要检索已审计的数据更改,请使用以下任何消息。

网络应用程序接口 用于 .NET 的 SDK Description
RetrieveAuditDetails函数 RetrieveAuditDetailsRequest 类 从审核记录中检索完整的审核详细信息。
RetrieveAttributeChangeHistory 函数 RetrieveAttributeChangeHistoryRequest 类 检索已审核记录的单个列的更改历史记录。
RetrieveRecordChangeHistory 函数 RetrieveRecordChangeHistoryRequest 类 检索特定记录的所有已审计的数据更改。

若要使用这些消息,请确保拥有 prvReadRecordAuditHistory 和 prvReadAuditSummary 权限。

AuditDetail 类型

这些消息提供了更多详细信息,具体取决于操作类型。 详细信息使用派生自基 AuditDetail 类型的类型,如下表所示。

网络应用程序接口 用于 .NET 的 SDK Description
AuditDetail ComplexType AuditDetail 类 显示派生类的基类型。 提供对审核记录的访问权限。
AttributeAuditDetail ComplexType AttributeAuditDetail 类 提供记录发生数据更改时的详细信息。 提供对旧值和新值的访问权限。
由以下类型的操作返回:
- 表行事件
- 元数据更改事件
- 审计更改事件
RelationshipAuditDetail ComplexType RelationshipAuditDetail 类 提供使用多对多关系关联或取消关联记录时的详细信息。 提供关系的名称和该操作更改的记录列表。
由 多对多关系事件返回。
RolePrivilegeAuditDetail ComplexType RolePrivilegeAuditDetail 类 提供 安全角色(角色)记录的定义发生更改时的详细信息。 提供有关与角色关联的旧角色特权和新角色权限的信息。
由 安全角色更改事件返回。
ShareAuditDetail ComplexType ShareAuditDetail 类 提供有关共享或取消共享记录,或共享记录的访问级别发生更改时的详细信息。
由记录共享事件返回。
UserAccessAuditDetail ComplexType UserAccessAuditDetail 类 提供有关跟踪用户访问审计的详细信息。 提供有关时间间隔和访问时间的详细信息。
由 用户访问事件 返回的结果。

Important

  • 前面列出的从 AuditDetail ComplexType 继承的 Web API 类型不会返回它们应从 AuditDetail 继承的 AuditRecord 导航属性值。 用于.NET类的 SDK 返回此数据。

  • 或 AttributeAuditDetail 属性(例如 OldValue 或 NewValue)中包含的大型列值上限为 5 KB 或约 5,000 个字符。 通过文本末尾的省略号(…)识别被截断的列值;例如,“lorem ipsum, lorem ip…”。 由于数据被截断,因此不能使用它来还原对这些列值的更改。

RetrieveAuditDetails 消息

使用此消息检索单个审核记录的审核详细信息。

RetrieveAuditDetails 是绑定到审核表的函数。 在请求中包含 Prefer: odata.include-annotations="*" 请求标头以获取格式化值。

以下示例演示当在记录上设置account时返回的parentaccountid。

请求:

GET [Organization URI]/api/data/v9.2/audits(12869c65-d7d3-ec11-b656-281878f0eba9)/Microsoft.Dynamics.CRM.RetrieveAuditDetails

Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
If-None-Match: null
Prefer: odata.include-annotations="*" 

响应:

HTTP/1.1 200 OK
OData-Version: 4.0
Preference-Applied: odata.include-annotations="*"

{
 "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RetrieveAuditDetailsResponse",
 "AuditDetail": {
  "@odata.type": "#Microsoft.Dynamics.CRM.AttributeAuditDetail",
  "InvalidNewValueAttributes": [],
  "LocLabelLanguageCode": 0,
  "DeletedAttributes": {
   "Count": 0,
   "Keys": [],
   "Values": []
  },
  "OldValue": {
   "@odata.type": "#Microsoft.Dynamics.CRM.account"
  },
  "NewValue": {
   "@odata.type": "#Microsoft.Dynamics.CRM.account",
   "_parentaccountid_value@OData.Community.Display.V1.FormattedValue": "A. Datum Corporation",
   "_parentaccountid_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "parentaccountid",
   "_parentaccountid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "account",
   "_parentaccountid_value": "d249d106-38b5-ec11-983f-002248296cd0"
  }
 }
}

了解有关以下方面的详细信息:

检索属性更改历史记录消息

使用此消息检索特定表列的更改列表。

使用 PagingInfo 参数控制要返回的记录数,并向前或向后翻页。 对于后续请求,请将 属性设置为由 返回的值。

此消息的更改始终为AttributeAuditDetail类型。

此示例返回description表记录的account列的单个审核更改历史记录。

请求:

GET [Organization URI]/api/data/v9.2/RetrieveAttributeChangeHistory(Target=@target,AttributeLogicalName=@attributeLogicalName,PagingInfo=@paginginfo)?
@target={ '@odata.id':'accounts(611e7713-68d7-4622-b552-85060af450bc)'}
&@attributeLogicalName='description'
&@paginginfo={
   "PageNumber": 1,
   "Count": 1,
   "ReturnTotalRecordCount": true
}

Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
If-None-Match: null

响应:

HTTP/1.1 200 OK

{
 "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RetrieveAttributeChangeHistoryResponse",
 "AuditDetailCollection": {
  "MoreRecords": true,
  "PagingCookie": "<cookie page=\"1\"><cookieExtensions ContinuationToken=\"{&quot;pageNumber&quot;:2,&quot;continuationToken&quot;:&quot;[{\\&quot;compositeToken\\&quot;:{\\&quot;token\\&quot;:null,\\&quot;range\\&quot;:{\\&quot;min\\&quot;:\\&quot;3A800000000000000000000000000000\\&quot;,\\&quot;max\\&quot;:\\&quot;3B000000000000000000000000000000\\&quot;}},\\&quot;orderByItems\\&quot;:[{\\&quot;item\\&quot;:\\&quot;2022-05-13T22:06:46.6175613Z\\&quot;}],\\&quot;rid\\&quot;:\\&quot;CVoNAJIidnNsmz0AAADwAw==\\&quot;,\\&quot;skipCount\\&quot;:0,\\&quot;filter\\&quot;:null}]&quot;}\" /></cookie>",
  ,
  "TotalRecordCount": 3,
  "AuditDetails": [
   {
    "@odata.type": "#Microsoft.Dynamics.CRM.AttributeAuditDetail",
    "InvalidNewValueAttributes": [],
    "LocLabelLanguageCode": 0,
    "DeletedAttributes": {
     "Count": 0,
     "Keys": [],
     "Values": []
    },
    "OldValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "description": "Old description value"
    },
    "NewValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "description": "New description value"
    }
   }
  ]
 }
}

了解有关以下方面的详细信息:

RetrieveRecordChangeHistory 消息

该 RetrieveRecordChangeHistory 消息显示由 Target 参数指示的记录的数据更改历史记录。

使用 PagingInfo 参数控制要返回的记录数,并在页面之间向前或向后翻页。 对于后续请求,请将 属性设置为 返回的值。

选择>AttributeAuditDetail时,通常会在模型驱动应用中看到此消息的结果显示为数据。 它显示记录的旧值和新值,但也返回 RelationshipAuditDetail 和 ShareAuditDetail 类型。

还可以将此消息与 systemuser 和 role 表一起使用,以返回 RolePrivilegeAuditDetail 和 UserAccessAuditDetail 类型。

以下示例仅返回对帐户记录的四项更改中的前两项。

请求:

GET [Organization URI]/api/data/v9.2/RetrieveRecordChangeHistory(Target=@target,PagingInfo=@paginginfo)?
@target={ '@odata.id':'accounts(611e7713-68d7-4622-b552-85060af450bc)'}
&@paginginfo={
   "PageNumber": 1,
   "Count": 2,
   "ReturnTotalRecordCount": true
}
Accept: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0
If-None-Match: null

响应:

HTTP/1.1 200 OK

{
 "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RetrieveRecordChangeHistoryResponse",
 "AuditDetailCollection": {
  "MoreRecords": true,
  "PagingCookie": "<cookie page=\"1\"><cookieExtensions ContinuationToken=\"{&quot;pageNumber&quot;:2,&quot;continuationToken&quot;:&quot;[{\\&quot;compositeToken\\&quot;:{\\&quot;token\\&quot;:null,\\&quot;range\\&quot;:{\\&quot;min\\&quot;:\\&quot;38000000000000000000000000000000\\&quot;,\\&quot;max\\&quot;:\\&quot;38800000000000000000000000000000\\&quot;}},\\&quot;orderByItems\\&quot;:[{\\&quot;item\\&quot;:\\&quot;2022-05-13T22:06:27.8029732Z\\&quot;}],\\&quot;rid\\&quot;:\\&quot;CVoNAJIidnPOnT0AAAAICA==\\&quot;,\\&quot;skipCount\\&quot;:0,\\&quot;filter\\&quot;:null}]&quot;}\" /></cookie>",
  "TotalRecordCount": 4,
  "AuditDetails": [
   {
    "@odata.type": "#Microsoft.Dynamics.CRM.AttributeAuditDetail",
    "InvalidNewValueAttributes": [],
    "LocLabelLanguageCode": 0,
    "DeletedAttributes": {
     "Count": 0,
     "Keys": [],
     "Values": []
    },
    "OldValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "description": "Old description value"
    },
    "NewValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "description": "New description value"
    }
   },
   {
    "@odata.type": "#Microsoft.Dynamics.CRM.AttributeAuditDetail",
    "InvalidNewValueAttributes": [],
    "LocLabelLanguageCode": 0,
    "DeletedAttributes": {
     "Count": 0,
     "Keys": [],
     "Values": []
    },
    "OldValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "_ownerid_value@OData.Community.Display.V1.FormattedValue": "FirstName LastName",
     "_ownerid_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "ownerid",
     "_ownerid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "systemuser",
     "_ownerid_value": "4026be43-6b69-e111-8f65-78e7d1620f5e"
    },
    "NewValue": {
     "@odata.type": "#Microsoft.Dynamics.CRM.account",
     "_ownerid_value@OData.Community.Display.V1.FormattedValue": "TeamName",
     "_ownerid_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "ownerid",
     "_ownerid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "team",
     "_ownerid_value": "39e0dbe4-131b-e111-ba7e-78e7d1620f5e"
    }
   }
  ]
 }
}

Note

返回的 AuditDetail ComplexType 值不包含该 AuditRecord 属性,因此没有有关谁进行了更改以及何时进行了更改的数据。

了解有关以下方面的详细信息:

另请参阅

审核概述
配置审计
删除审核数据
管理 Dataverse 审核
示例:审核表数据更改
示例:审核用户访问