Set-SqlColumnEncryption

加密、解密或重新加密数据库中的指定列。

语法

Set-SqlColumnEncryption
   -ColumnEncryptionSettings <SqlColumnEncryptionSettings[]>
   [-UseOnlineApproach]
   [-KeepCheckForeignKeyConstraints]
   [-MaxDowntimeInSeconds <Int32>]
   [-KeyVaultAccessToken <String>]
   [-ManagedHsmAccessToken <String>]
   [-LockTimeoutInSeconds <Int32>]
   [-MaxIterationDurationInDays <Int32>]
   [-MaxDivergingIterations <Int32>]
   [-MaxIterations <Int32>]
   [-EnclaveAttestationProtocol <SqlConnectionAttestationProtocol>]
   [-EnclaveAttestationURL <String>]
   [-LogFileDirectory <String>]
   [-InputObject] <Database>
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [<CommonParameters>]
Set-SqlColumnEncryption
   -ColumnEncryptionSettings <SqlColumnEncryptionSettings[]>
   [-UseOnlineApproach]
   [-KeepCheckForeignKeyConstraints]
   [-MaxDowntimeInSeconds <Int32>]
   [-KeyVaultAccessToken <String>]
   [-ManagedHsmAccessToken <String>]
   [-LockTimeoutInSeconds <Int32>]
   [-MaxIterationDurationInDays <Int32>]
   [-MaxDivergingIterations <Int32>]
   [-MaxIterations <Int32>]
   [-EnclaveAttestationProtocol <SqlConnectionAttestationProtocol>]
   [-EnclaveAttestationURL <String>]
   [-LogFileDirectory <String>]
   [[-Path] <String>]
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [<CommonParameters>]

说明

Set-SqlColumnEncryption cmdlet 使用Always Encrypted功能加密、解密或重新加密指定的数据库列。

cmdlet 接受 SqlColumnEncryptionSettings 对象的数组,其中每个对象指定数据库中一列的目标加密配置。

该 cmdlet 将加密、解密或重新加密每个指定的列,具体取决于列的当前加密配置和指定的目标加密设置。

cmdlet 与保存列主密钥的密钥存储进行通信。 如果任何保护要加密、解密或重新加密的列的主密钥存储在 Azure 中,则需要为密钥保管库或保存密钥的托管 HSM 指定有效的身份验证令牌。 或者,在调用此 cmdlet 之前,可以使用 Add-SqlAzureAuthenticationContext 向 Azure 进行身份验证。

Module requirements: version 21+ on PowerShell 5.1; version 22+ on PowerShell 7.x.

示例

示例 1:将指定的目标加密设置应用于三个数据库列。

在此示例中, dbo.Student.Id 使用确定性加密和名为 MyCEK的列加密密钥对列进行加密。

使用 dbo.Student.LastName 随机加密和列加密密钥(名为 MyCEK)对列进行加密。

dbo.StudentFirstName 不会加密 (如果列最初已加密,则会) 解密。

该示例使用脱机方法,这意味着 Student 表在整个操作过程中仍无法进行更新。 假设列主密钥保护 MyCEK未存储在 Azure 密钥保管库中。

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek'
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory .

示例 2:将指定的目标加密设置应用于三个数据库列, (列主密钥存储在 Azure 密钥保管库.)

此示例类似于上面的示例:唯一的区别是列主密钥保护MyCEK存储在 Azure 密钥保管库中。

# Connect to Azure account.
Import-Module Az.Accounts -MinimumVersion 2.2.0
Connect-AzAccount

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek' 
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'

# Pass the token to the cmdlet. It will use the token to communicate with Azure Key Vault to obtain the plaintext value of the column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

示例 3:使用联机方法将指定的目标加密设置应用于三个数据库列。

在此示例中 Student ,表最多 30 秒 (使用 MaxDowntimeInSeconds 参数指定的值进行读取和写入。) 假设列主密钥保护 MyCEK存储在 Azure 外部, (不需要) 传递 Azure 令牌。

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek'
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -UseOnlineApproach -MaxDowntimeInSeconds 30 -LogFileDirectory .

示例 4:使用就地加密将目标加密设置应用于多个列。

$ces1 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.Id        -EncryptionType 'Randomized' -EncryptionKey 'CEK1' 
$ces2 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.LastName  -EncryptionType 'Randomized' -EncryptionKey 'CEK1' 
$ces3 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.FirstName -EncryptionType 'Randomized' -EncryptionKey 'CEK1'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory . -EnclaveAttestationProtocol 'AAS' -EnclaveAttestationURL 'https://enclavedemoattest.weu.attest.azure.net'

此示例使用就地加密将目标加密设置应用于数据库列,前提是满足就地加密的所有先决条件,即数据库启用了 enclave,并且 cmdlet 触发的加密操作中使用的密钥已启用 enclave。

参数

-AccessToken

用于对SQL Server进行身份验证的访问令牌,作为用户/密码或 Windows 身份验证的替代方法。

例如,这可用于连接到 SQL Azure DB 和使用 SQL Azure Managed InstanceService PrincipalManaged Identity

要使用的参数可以是表示令牌的字符串,也可以是 PSAccessToken 运行 Get-AzAccessToken -ResourceUrl https://database.windows.net返回的对象。

此参数是模块 v22 中的新增参数。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ColumnEncryptionSettings

指定 SqlColumnEncryptionSettings 对象的数组,其中每个对象指定数据库中一列的目标加密配置。

Type:SqlColumnEncryptionSettings[]
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-EnclaveAttestationProtocol

为具有安全 enclave 的Always Encrypted指定 enclave 的证明协议。 cmdlet 需要此参数才能在服务器端安全 enclave 中就地执行加密操作,以取消下载和上传数据的费用。 请注意,就地加密还有其他先决条件:数据库必须配置 enclave,并且需要使用已启用 enclave 的加密密钥。

Type:SqlConnectionAttestationProtocol
Aliases:AttestationProtocol
Accepted values:NotSpecified, AAS, None, HGS
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-EnclaveAttestationURL

指定使用具有安全 enclave 的 Always Encrypted 时进行就地加密的 enclave 证明 URL。 如果 EnclaveAttestationProtocol 设置为 AASHGS,则是必需的。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Encrypt

连接到SQL Server时使用的加密类型。

此值映射到 Encrypt Microsoft.Data.SqlClient 驱动程序的 SqlConnection 对象上的 属性 SqlConnectionEncryptOption

在模块的 v22 中,默认 Optional 为 (,以便与 v21) 兼容。 在模块的 v23+ 中,默认值为“必需”,这可能会为现有脚本创建中断性变更。

此参数是模块 v22 中的新增参数。

Type:String
Accepted values:Mandatory, Optional, Strict
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-HostNameInCertificate

验证 SQL Server TLS/SSL 证书时要使用的主机名。 如果SQL Server实例启用了强制加密,并且你想要使用主机名/shortname 连接到实例,则必须传递此参数。 如果省略此参数,则必须将完全限定的域名 (FQDN) 传递给 -ServerInstance 才能连接到启用强制加密的SQL Server实例。

此参数是模块 v22 中的新增参数。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定此 cmdlet 为其运行操作的 SQL 数据库对象。

Type:Database
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-KeepCheckForeignKeyConstraints

如果已设置,则保留外键约束 (CHECK 或 NOCHECK) 检查语义。

否则,如果未设置,并且未设置 UseOnlineApproach ,则始终使用 NOCHECK 选项重新创建外键约束,以最大程度地减少对应用程序的影响。

KeepCheckForeignKeyConstraints 仅在设置 UseOnlineApproach 时有效。

使用脱机方法时,始终保留外键约束的语义。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-KeyVaultAccessToken

为 Azure 密钥保管库中的密钥保管库指定访问令牌。 如果保护要加密、解密或重新加密的列的任何列主密钥存储在 Azure 密钥保管库的密钥保管库中,请使用此参数。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-LockTimeoutInSeconds

指定 (的最长时间(以秒为单位),) cmdlet 将等待开始上一次补时迭代所需的数据库锁。 值 -1 (默认) 表示没有超时期限 (即,永远等待) 。 值为 0 表示根本不等待。 当锁等待超过超时值时,将返回错误。 仅当设置了 UseOnlineApproach 时有效。

Type:Int32
Position:Named
Default value:-1
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-LogFileDirectory

如果设置,cmdlet 将在指定的目录中创建日志文件。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ManagedHsmAccessToken

指定 Azure 密钥保管库中托管 HSM 的访问令牌。 如果保护要加密、解密或重新加密的列的任何列主密钥存储在 Azure 密钥保管库的托管 HSM 中,请使用此参数。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-MaxDivergingIterations

指定连续追赶迭代的最大次数,其中处理行数增加。 达到此限制后,cmdlet 假定它无法赶上源表中所做的更改,并中止操作并重新创建数据库的原始状态。 仅当设置了 UseOnlineApproach 时有效。 必须小于 MaxIterations 的值。

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-MaxDowntimeInSeconds

指定) (的最长时间(以秒为单位),在此期间,源表将不可用于读取和写入。 仅当设置了 UseOnlineApproach 时有效。

Type:Int32
Position:Named
Default value:1800
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-MaxIterationDurationInDays

指定种子设定或单个补时迭代) (的最长时间(以天为单位)。 如果种子设定或任何补时迭代花费的时间超过指定值,则 cmdlet 会中止操作并重新创建数据库的原始状态。 仅当设置了 UseOnlineApproach 时有效。

Type:Int32
Position:Named
Default value:3
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-MaxIterations

指定追赶阶段中的最大迭代次数。 达到此限制时,cmdlet 会中止操作并重新创建数据库的原始状态。 仅当设置了 UseOnlineApproach 时有效。

Type:Int32
Position:Named
Default value:100
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

指定 SQL 数据库的路径,此 cmdlet 为其运行操作。 如果未为此参数指定值,则 cmdlet 将使用当前工作位置。

Type:String
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Script

指示此 cmdlet 返回执行此 cmdlet 执行的任务的 Transact-SQL 脚本。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TrustServerCertificate

指示是否在绕过证书链以验证信任时对通道进行加密。

在模块的 v22 中,默认 $true 为 (,以便与 v21) 兼容。 在模块的 v23+ 中,默认值为“$false”,这可能会为现有脚本创建中断性变更。

此参数是模块 v22 中的新增参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseOnlineApproach

如果设置,cmdlet 将使用联机方法,以确保数据库可供其他应用程序在操作的大部分时间进行读取和写入。

否则,cmdlet 将锁定受影响的表,使其无法用于整个操作的更新。 这些表将可用于读取。

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

输入

Microsoft.SqlServer.Management.Smo.Database

输出

String