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>]
   [-AllowVerboseLogging]
   [-InputObject] <Database>
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [-ProgressAction <ActionPreference>]
   [<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>]
   [-AllowVerboseLogging]
   [[-Path] <String>]
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [-ProgressAction <ActionPreference>]
   [<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 列未加密(如果列最初已加密,则会解密)。

该示例使用脱机方法,这意味着学生表在整个操作中仍无法更新。 假设列主密钥(保护 MyCEK)未存储在 Azure Key Vault 中。

$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 Key Vault 中)。

此示例类似于上面的示例;唯一的区别是,保护 MyCEK 的列主密钥存储在 Azure Key Vault 中。

# 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 身份验证的替代方法。

例如,这可用于使用 Service PrincipalManaged Identity连接到 SQL Azure DBSQL Azure Managed Instance

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

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

类型:PSObject
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-AllowVerboseLogging

如果设置,cmdlet 会将详细消息添加到日志文件(如果设置了“LogFileDirectory”参数),并保留基础库用于执行操作的 dacpac 文件。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ColumnEncryptionSettings

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

类型:SqlColumnEncryptionSettings[]
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-EnclaveAttestationProtocol

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

类型:SqlConnectionAttestationProtocol
别名:AttestationProtocol
接受的值:NotSpecified, AAS, None, HGS
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-EnclaveAttestationURL

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Encrypt

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

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

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

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

类型:String
接受的值:Mandatory, Optional, Strict
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-HostNameInCertificate

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

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-InputObject

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

类型:Database
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-KeepCheckForeignKeyConstraints

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

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

仅当设置了 UseOnlineApproach 时,KeepCheckForeignKeyConstraints 才有效。

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

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-KeyVaultAccessToken

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-LockTimeoutInSeconds

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

类型:Int32
Position:Named
默认值:-1
必需:False
接受管道输入:False
接受通配符:False

-LogFileDirectory

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ManagedHsmAccessToken

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-MaxDivergingIterations

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

类型:Int32
Position:Named
默认值:5
必需:False
接受管道输入:False
接受通配符:False

-MaxDowntimeInSeconds

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

类型:Int32
Position:Named
默认值:1800
必需:False
接受管道输入:False
接受通配符:False

-MaxIterationDurationInDays

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

类型:Int32
Position:Named
默认值:3
必需:False
接受管道输入:False
接受通配符:False

-MaxIterations

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

类型:Int32
Position:Named
默认值:100
必需:False
接受管道输入:False
接受通配符:False

-Path

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

类型:String
Position:1
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ProgressAction

确定 PowerShell 如何响应脚本、cmdlet 或提供程序生成的进度更新,例如由 Write-Progress cmdlet 生成的进度栏。 Write-Progress cmdlet 创建显示命令状态的进度栏。

类型:ActionPreference
别名:proga
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Script

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

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-TrustServerCertificate

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

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

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

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-UseOnlineApproach

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

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

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

输入

Microsoft.SqlServer.Management.Smo.Database

输出

String