启用审核后,在已审核的表和列中更改数据时,可以检索这些表和列的更改历史记录。
无法使用 Dataverse TDS (SQL) 终结点访问审核数据。
移动应用中的表不提供审核历史记录。
审核表
审核(Audit)表存储审核事件。 在 Web API 中, audit EntityType 是此数据的资源。 审核表是只读的。
审核表提供了 Power Platform 管理中心中显示的“查看审核摘要”的数据。
确保调用用户具有prvReadAuditSummary权限从表中检索数据。
下表汇总了审核表中的重要列。
| SchemaName 逻辑名称 DisplayName |
类型 | Description |
|---|---|---|
ActionactionEvent |
选项 | 表示导致更改的事件。 详细了解操作。 |
AttributeMaskattributemask已更改的字段 |
备忘录 | 如果更改表示对记录数据的更改,则该值包含与已更改列的 AttributeMetadata.ColumnNumber 对应的、以逗号分隔的数字列表。 注意: 请勿使用此数据。 请改用消息 来检索更改历史记录。 |
AuditIdauditid记录 ID |
唯一标识符 | 标识审核表的主键。 |
CallingUserIdcallinguserid呼叫用户 |
查找 | 当操作使用模拟时,标识调用用户;否则为 null。 |
CreatedOncreatedon更改日期 |
日期/时间 | 标识创建审核记录的时间,即发生用户操作的时间。 2025 年 7 月,此值的精度已提升到包含毫秒。 此更改捕获具有多个操作的事务中的正确审核事件序列。 |
ObjectIdobjectid记录 |
查找 | 唯一标识已审计的记录。 |
ObjectTypeCodeobjecttypecode实体 |
实体名称 | 显示列引用 objectid 的表的逻辑名称。 |
Operationoperation运算 |
选项 | 标识创建审核记录的操作;四个值之一: 1 = 创建 2 = 更新 3 = 删除 4 = 访问 |
UserIduserid更改者 |
查找 | 显示更改数据的用户的 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=\"{"pageNumber":2,"continuationToken":"[{\\"compositeToken\\":{\\"token\\":null,\\"range\\":{\\"min\\":\\"3A800000000000000000000000000000\\",\\"max\\":\\"3B000000000000000000000000000000\\"}},\\"orderByItems\\":[{\\"item\\":\\"2022-05-13T22:06:46.6175613Z\\"}],\\"rid\\":\\"CVoNAJIidnNsmz0AAADwAw==\\",\\"skipCount\\":0,\\"filter\\":null}]"}\" /></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=\"{"pageNumber":2,"continuationToken":"[{\\"compositeToken\\":{\\"token\\":null,\\"range\\":{\\"min\\":\\"38000000000000000000000000000000\\",\\"max\\":\\"38800000000000000000000000000000\\"}},\\"orderByItems\\":[{\\"item\\":\\"2022-05-13T22:06:27.8029732Z\\"}],\\"rid\\":\\"CVoNAJIidnPOnT0AAAAICA==\\",\\"skipCount\\":0,\\"filter\\":null}]"}\" /></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 属性,因此没有有关谁进行了更改以及何时进行了更改的数据。
了解有关以下方面的详细信息: