Microsoft.Sql servers/extendedAuditingSettings 2021-02-01-preview
Bicep 資源定義
servers/extendedAuditingSettings 資源類型可以使用目標作業進行部署:
- 資源群組 - 請參閱 資源群組部署命令
如需每個 API 版本中已變更屬性的清單,請參閱 變更記錄檔。
資源格式
若要建立 Microsoft.Sql/servers/extendedAuditingSettings 資源,請將下列 Bicep 新增至範本。
resource symbolicname 'Microsoft.Sql/servers/extendedAuditingSettings@2021-02-01-preview' = {
name: 'default'
parent: resourceSymbolicName
properties: {
auditActionsAndGroups: [
'string'
]
isAzureMonitorTargetEnabled: bool
isDevopsAuditEnabled: bool
isStorageSecondaryKeyInUse: bool
predicateExpression: 'string'
queueDelayMs: int
retentionDays: int
state: 'string'
storageAccountAccessKey: 'string'
storageAccountSubscriptionId: 'string'
storageEndpoint: 'string'
}
}
屬性值
servers/extendedAuditingSettings
名稱 | 描述 | 值 |
---|---|---|
NAME | 資源名稱 瞭解如何在 Bicep 中設定子資源的名稱和類型。 |
'default' |
父系 (parent) | 在 Bicep 中,您可以指定子資源的父資源。 只有在父資源外部宣告子資源時,才需要新增此屬性。 如需詳細資訊,請參閱 父資源外部的子資源。 |
類型資源的符號名稱: 伺服器 |
properties | 資源屬性。 | ExtendedServerBlobAuditingPolicyProperties |
ExtendedServerBlobAuditingPolicyProperties
名稱 | 描述 | 值 |
---|---|---|
auditActionsAndGroups | 指定要稽核的 Actions-Groups 和動作。 建議使用的一組動作群組是下列組合- 這會稽核針對資料庫執行的所有查詢和預存程式,以及成功和失敗的登入: BATCH_COMPLETED_GROUP, SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP, FAILED_DATABASE_AUTHENTICATION_GROUP。 上述組合也是從 Azure 入口網站 啟用稽核時預設設定的集合。 要稽核的支援動作群組 (附注:僅選擇涵蓋稽核需求的特定群組。使用不必要的群組可能會導致非常大量的稽核記錄) : APPLICATION_ROLE_CHANGE_PASSWORD_GROUP BACKUP_RESTORE_GROUP DATABASE_LOGOUT_GROUP DATABASE_OBJECT_CHANGE_GROUP DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP DATABASE_OBJECT_PERMISSION_CHANGE_GROUP DATABASE_OPERATION_GROUP DATABASE_PERMISSION_CHANGE_GROUP DATABASE_PRINCIPAL_CHANGE_GROUP DATABASE_PRINCIPAL_IMPERSONATION_GROUP DATABASE_ROLE_MEMBER_CHANGE_GROUP FAILED_DATABASE_AUTHENTICATION_GROUP SCHEMA_OBJECT_ACCESS_GROUP SCHEMA_OBJECT_CHANGE_GROUP SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP USER_CHANGE_PASSWORD_GROUP BATCH_STARTED_GROUP BATCH_COMPLETED_GROUP DBCC_GROUP DATABASE_OWNERSHIP_CHANGE_GROUP DATABASE_CHANGE_GROUP LEDGER_OPERATION_GROUP 這些群組涵蓋針對資料庫執行的所有 sql 語句和預存程式,不應與其他群組搭配使用,因為這樣會導致重複的稽核記錄。 如需詳細資訊,請參閱 資料庫層級稽核動作群組。 針對資料庫稽核原則,也可以指定特定動作 (請注意,無法為伺服器稽核原則指定動作) 。 要稽核的支援動作如下: SELECT UPDATE Insert 刪除 執行 CREATE 陳述式之前,請先執行 RECEIVE REFERENCES 定義要稽核之動作的一般窗體如下: {action}ON {object} BY {principal} 請注意,上述格式的 {object} 可以參照數據表、檢視或預存程式或整個資料庫或架構等物件。 在後者的情況下,會分別使用DATABASE::{db_name} 和SCHEMA::{schema_name}。 例如: 依公用在 dbo.myTable 上選取 SELECT on DATABASE::myDatabase by public SELECT on SCHEMA::mySchema by public 如需詳細資訊,請參閱 資料庫層級稽核動作 |
string[] |
isAzureMonitorTargetEnabled | 指定稽核事件是否傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled',並將 'IsAzureMonitorTargetEnabled' 指定為 true。 使用 REST API 來設定稽核時,也應該在資料庫上建立具有 'SQLSecurityAuditEvents' 診斷記錄類別的診斷設定。 請注意,針對伺服器層級稽核,您應該使用 'master' 資料庫作為 {databaseName}。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isDevopsAuditEnabled | 指定 devops 稽核的狀態。 如果狀態為 [已啟用],則會將 devops 記錄傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled'、'IsAzureMonitorTargetEnabled' 為 true,並將 'IsDevopsAuditEnabled' 指定為 true 使用 REST API 來設定稽核時,也應該在 master 資料庫上建立具有 'DevOpsOperationsAudit' 診斷記錄類別的診斷設定。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/master/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isStorageSecondaryKeyInUse | 指定 storageAccountAccessKey 值是否為記憶體的次要密鑰。 | bool |
predicateExpression | 指定建立稽核時 where 子句的條件。 | 字串 |
queueDelayMs | 指定在強制處理稽核動作之前經過的時間長度 (以毫秒為單位)。 預設的最小值為 1000 (1 秒鐘)。 最大值為 2,147,483,647。 |
int |
retentionDays | 指定要保留在記憶體帳戶中的稽核記錄中的天數。 | int |
狀態 | 指定稽核的狀態。 如果 state 為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 | 'Disabled' 必要 ('Enabled') |
storageAccountAccessKey | 指定稽核記憶體帳戶的標識碼金鑰。 如果狀態為 Enabled 且指定 storageEndpoint,則未指定 storageAccountAccessKey 將會使用 SQL Server 系統指派的受控識別來存取記憶體。 使用受控識別驗證的必要條件: 1.在 Azure Active Directory (AAD) 中指派系統指派的受控識別 SQL Server。 2.將「記憶體 Blob 數據參與者」RBAC 角色新增至伺服器身分識別,以授與 SQL Server 記憶體帳戶的身分識別存取權。 如需詳細資訊,請參閱 使用受控識別驗證稽核記憶體 |
字串 約束: 敏感性值。 以安全參數的形式傳入。 |
storageAccountSubscriptionId | 指定 Blob 記憶體訂用帳戶標識碼。 | 字串 約束: 最小長度 = 36 最大長度 = 36 模式 = ^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$ |
storageEndpoint | 指定 blob 記憶體端點 (例如 https://MyAccount.blob.core.windows.net ) 。 如果狀態為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 |
字串 |
ARM 範本資源定義
servers/extendedAuditingSettings 資源類型可以使用目標作業進行部署:
- 資源群組 - 請參閱 資源群組部署命令
如需每個 API 版本中已變更屬性的清單,請參閱 變更記錄檔。
資源格式
若要建立 Microsoft.Sql/servers/extendedAuditingSettings 資源,請將下列 JSON 新增至範本。
{
"type": "Microsoft.Sql/servers/extendedAuditingSettings",
"apiVersion": "2021-02-01-preview",
"name": "default",
"properties": {
"auditActionsAndGroups": [ "string" ],
"isAzureMonitorTargetEnabled": "bool",
"isDevopsAuditEnabled": "bool",
"isStorageSecondaryKeyInUse": "bool",
"predicateExpression": "string",
"queueDelayMs": "int",
"retentionDays": "int",
"state": "string",
"storageAccountAccessKey": "string",
"storageAccountSubscriptionId": "string",
"storageEndpoint": "string"
}
}
屬性值
servers/extendedAuditingSettings
名稱 | 描述 | 值 |
---|---|---|
類型 | 資源類型 | 'Microsoft.Sql/servers/extendedAuditingSettings' |
apiVersion | 資源 API 版本 | '2021-02-01-preview' |
NAME | 資源名稱 瞭解如何在 JSON ARM 範本中設定子資源的名稱和類型。 |
'default' |
properties | 資源屬性。 | ExtendedServerBlobAuditingPolicyProperties |
ExtendedServerBlobAuditingPolicyProperties
名稱 | 描述 | 值 |
---|---|---|
auditActionsAndGroups | 指定要稽核的 Actions-Groups 和動作。 建議使用的一組動作群組是下列組合- 這會稽核針對資料庫執行的所有查詢和預存程式,以及成功和失敗的登入: BATCH_COMPLETED_GROUP, SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP, FAILED_DATABASE_AUTHENTICATION_GROUP。 上述組合也是從 Azure 入口網站 啟用稽核時預設設定的集合。 要稽核的支援動作群組 (附注:僅選擇涵蓋稽核需求的特定群組。使用不必要的群組可能會導致非常大量的稽核記錄) : APPLICATION_ROLE_CHANGE_PASSWORD_GROUP BACKUP_RESTORE_GROUP DATABASE_LOGOUT_GROUP DATABASE_OBJECT_CHANGE_GROUP DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP DATABASE_OBJECT_PERMISSION_CHANGE_GROUP DATABASE_OPERATION_GROUP DATABASE_PERMISSION_CHANGE_GROUP DATABASE_PRINCIPAL_CHANGE_GROUP DATABASE_PRINCIPAL_IMPERSONATION_GROUP DATABASE_ROLE_MEMBER_CHANGE_GROUP FAILED_DATABASE_AUTHENTICATION_GROUP SCHEMA_OBJECT_ACCESS_GROUP SCHEMA_OBJECT_CHANGE_GROUP SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP USER_CHANGE_PASSWORD_GROUP BATCH_STARTED_GROUP BATCH_COMPLETED_GROUP DBCC_GROUP DATABASE_OWNERSHIP_CHANGE_GROUP DATABASE_CHANGE_GROUP LEDGER_OPERATION_GROUP 這些群組涵蓋針對資料庫執行的所有 sql 語句和預存程式,不應與其他群組搭配使用,因為這樣會導致重複的稽核記錄。 如需詳細資訊,請參閱 資料庫層級稽核動作群組。 針對資料庫稽核原則,也可以指定特定動作 (請注意,無法為伺服器稽核原則指定動作) 。 要稽核的支援動作如下: SELECT UPDATE Insert 刪除 執行 CREATE 陳述式之前,請先執行 RECEIVE REFERENCES 定義要稽核之動作的一般窗體如下: {action}ON {object} BY {principal} 請注意,上述格式的 {object} 可以參照數據表、檢視或預存程式或整個資料庫或架構等物件。 在後者的情況下,會分別使用DATABASE::{db_name} 和SCHEMA::{schema_name}。 例如: 依公用在 dbo.myTable 上選取 SELECT on DATABASE::myDatabase by public SELECT on SCHEMA::mySchema by public 如需詳細資訊,請參閱 資料庫層級稽核動作 |
string[] |
isAzureMonitorTargetEnabled | 指定稽核事件是否傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled',並將 'IsAzureMonitorTargetEnabled' 指定為 true。 使用 REST API 來設定稽核時,也應該在資料庫上建立具有 'SQLSecurityAuditEvents' 診斷記錄類別的診斷設定。 請注意,針對伺服器層級稽核,您應該使用 'master' 資料庫作為 {databaseName}。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isDevopsAuditEnabled | 指定 devops 稽核的狀態。 如果狀態為 [已啟用],則會將 devops 記錄傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled'、'IsAzureMonitorTargetEnabled' 為 true,並將 'IsDevopsAuditEnabled' 指定為 true 使用 REST API 來設定稽核時,也應該在 master 資料庫上建立具有 'DevOpsOperationsAudit' 診斷記錄類別的診斷設定。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/master/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isStorageSecondaryKeyInUse | 指定 storageAccountAccessKey 值是否為記憶體的次要密鑰。 | bool |
predicateExpression | 指定建立稽核時 where 子句的條件。 | 字串 |
queueDelayMs | 指定在強制處理稽核動作之前經過的時間長度 (以毫秒為單位)。 預設的最小值為 1000 (1 秒鐘)。 最大值為 2,147,483,647。 |
int |
retentionDays | 指定要保留在記憶體帳戶中的稽核記錄中的天數。 | int |
狀態 | 指定稽核的狀態。 如果 state 為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 | 'Disabled' 必要 ('Enabled') |
storageAccountAccessKey | 指定稽核記憶體帳戶的標識碼金鑰。 如果狀態為 Enabled 且指定 storageEndpoint,則未指定 storageAccountAccessKey 將會使用 SQL Server 系統指派的受控識別來存取記憶體。 使用受控識別驗證的必要條件: 1.在 Azure Active Directory (AAD) 中指派系統指派的受控識別 SQL Server。 2.將「記憶體 Blob 數據參與者」RBAC 角色新增至伺服器身分識別,以授與記憶體帳戶的 SQL Server 身分識別存取權。 如需詳細資訊,請參閱 使用受控識別驗證稽核記憶體 |
字串 約束: 敏感性值。 以安全參數的形式傳入。 |
storageAccountSubscriptionId | 指定 Blob 記憶體訂用帳戶標識碼。 | 字串 約束: 最小長度 = 36 最大長度 = 36 模式 = ^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$ |
storageEndpoint | 指定 blob 記憶體端點 (例如 https://MyAccount.blob.core.windows.net ) 。 如果狀態為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 |
字串 |
Terraform (AzAPI 提供者) 資源定義
伺服器/extendedAuditingSettings 資源類型可以使用目標作業來部署:
- 資源群組
如需每個 API 版本中已變更屬性的清單,請參閱 變更記錄。
資源格式
若要建立 Microsoft.Sql/servers/extendedAuditingSettings 資源,請將下列 Terraform 新增至您的範本。
resource "azapi_resource" "symbolicname" {
type = "Microsoft.Sql/servers/extendedAuditingSettings@2021-02-01-preview"
name = "default"
parent_id = "string"
body = jsonencode({
properties = {
auditActionsAndGroups = [
"string"
]
isAzureMonitorTargetEnabled = bool
isDevopsAuditEnabled = bool
isStorageSecondaryKeyInUse = bool
predicateExpression = "string"
queueDelayMs = int
retentionDays = int
state = "string"
storageAccountAccessKey = "string"
storageAccountSubscriptionId = "string"
storageEndpoint = "string"
}
})
}
屬性值
servers/extendedAuditingSettings
名稱 | 描述 | 值 |
---|---|---|
類型 | 資源類型 | “Microsoft.Sql/servers/extendedAuditingSettings@2021-02-01-preview” |
NAME | 資源名稱 | "default" |
parent_id | 此資源之父系的資源標識碼。 | 類型資源的識別碼: 伺服器 |
properties | 資源屬性。 | ExtendedServerBlobAuditingPolicyProperties |
ExtendedServerBlobAuditingPolicyProperties
名稱 | 描述 | 值 |
---|---|---|
auditActionsAndGroups | 指定要稽核的 Actions-Groups 和動作。 建議使用的一組動作群組是下列組合 - 這會稽核針對資料庫執行的所有查詢和預存程式,以及成功和失敗的登入: BATCH_COMPLETED_GROUP, SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP、 FAILED_DATABASE_AUTHENTICATION_GROUP。 上述組合也是從 Azure 入口網站 啟用稽核時預設設定的集合。 要稽核的支援動作群組 (注意:僅選擇涵蓋稽核需求的特定群組。使用不必要的群組可能會導致非常大量的稽核記錄) : APPLICATION_ROLE_CHANGE_PASSWORD_GROUP BACKUP_RESTORE_GROUP DATABASE_LOGOUT_GROUP DATABASE_OBJECT_CHANGE_GROUP DATABASE_OBJECT_OWNERSHIP_CHANGE_GROUP DATABASE_OBJECT_PERMISSION_CHANGE_GROUP DATABASE_OPERATION_GROUP DATABASE_PERMISSION_CHANGE_GROUP DATABASE_PRINCIPAL_CHANGE_GROUP DATABASE_PRINCIPAL_IMPERSONATION_GROUP DATABASE_ROLE_MEMBER_CHANGE_GROUP FAILED_DATABASE_AUTHENTICATION_GROUP SCHEMA_OBJECT_ACCESS_GROUP SCHEMA_OBJECT_CHANGE_GROUP SCHEMA_OBJECT_OWNERSHIP_CHANGE_GROUP SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP USER_CHANGE_PASSWORD_GROUP BATCH_STARTED_GROUP BATCH_COMPLETED_GROUP DBCC_GROUP DATABASE_OWNERSHIP_CHANGE_GROUP DATABASE_CHANGE_GROUP LEDGER_OPERATION_GROUP 這些群組涵蓋針對資料庫執行的所有 sql 語句和預存程式,不應與其他群組搭配使用,因為這樣會導致重複的稽核記錄。 如需詳細資訊,請參閱 資料庫層級稽核動作群組。 針對資料庫稽核原則,您也可以指定特定動作 (請注意,無法針對伺服器稽核原則指定動作) 。 要稽核的支援動作如下: SELECT UPDATE Insert 刪除 執行 CREATE 陳述式之前,請先執行 RECEIVE REFERENCES 定義要稽核之動作的一般形式如下: {action}ON {object} BY {principal} 請注意,上述格式的 {object} 可以參考數據表、檢視或預存程式或整個資料庫或架構等物件。 在後者的情況下,會分別使用DATABASE::{db_name} 和SCHEMA::{schema_name} 表單。 例如: 依 public 在 dbo.myTable 上選取 依公用在 DATABASE::myDatabase 上選取 SELECT on SCHEMA::mySchema by public 如需詳細資訊,請參閱 資料庫層級稽核動作 |
string[] |
isAzureMonitorTargetEnabled | 指定稽核事件是否傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled',並將 'IsAzureMonitorTargetEnabled' 指定為 true。 使用 REST API 設定稽核時,也應該在資料庫上建立具有 'SQLSecurityAuditEvents' 診斷記錄類別的診斷設定。 請注意,針對伺服器層級稽核,您應該使用 'master' 資料庫作為 {databaseName}。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/{databaseName}/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isDevopsAuditEnabled | 指定 devops 稽核的狀態。 如果狀態為 [已啟用],則會將 devops 記錄傳送至 Azure 監視器。 若要將事件傳送至 Azure 監視器,請將 'State' 指定為 'Enabled'、'IsAzureMonitorTargetEnabled' 為 true,並將 'IsDevopsAuditEnabled' 指定為 true 使用 REST API 設定稽核時,也應該在 master 資料庫上建立具有 『DevOpsOperationsAudit』 診斷記錄類別的診斷設定。 診斷設定 URI 格式: PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Sql/servers/{serverName}/databases/master/providers/microsoft.insights/diagnosticSettings/{settingsName}?api-version=2017-05-01-preview 如需詳細資訊,請參閱 診斷設定 REST API 或 診斷設定PowerShell |
bool |
isStorageSecondaryKeyInUse | 指定 storageAccountAccessKey 值是否為記憶體的次要密鑰。 | bool |
predicateExpression | 指定建立稽核時 where 子句的條件。 | 字串 |
queueDelayMs | 指定在強制處理稽核動作之前經過的時間長度 (以毫秒為單位)。 預設的最小值為 1000 (1 秒鐘)。 最大值為 2,147,483,647。 |
int |
retentionDays | 指定要保留在記憶體帳戶中稽核記錄中的天數。 | int |
狀態 | 指定稽核的狀態。 如果狀態為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 | “Disabled” 「已啟用」 (必要) |
storageAccountAccessKey | 指定稽核記憶體帳戶的標識碼金鑰。 如果狀態為 Enabled 且 storageEndpoint 已指定,則未指定 storageAccountAccessKey 將會使用 SQL Server 系統指派的受控識別來存取記憶體。 使用受控識別驗證的必要條件: 1.SQL Server 在 Azure Active Directory (AAD) 中指派系統指派的受控識別。 2.將「記憶體 Blob 數據參與者」RBAC 角色新增至伺服器身分識別,以授與記憶體帳戶的 SQL Server 身分識別存取權。 如需詳細資訊,請參閱 使用受控識別驗證稽核記憶體 |
字串 約束: 敏感性值。 以安全參數的形式傳入。 |
storageAccountSubscriptionId | 指定 Blob 記憶體訂用帳戶標識碼。 | 字串 約束: 最小長度 = 36 最大長度 = 36 模式 = ^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$ |
storageEndpoint | 指定 blob 記憶體端點 (例如 https://MyAccount.blob.core.windows.net ) 。 如果狀態為 Enabled,則需要 storageEndpoint 或 isAzureMonitorTargetEnabled。 |
字串 |