适用于: SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
要保护时序表,你必须理解适用于它们的安全原则。 理解这些原则后,你就可以将安全性应用于 ALTER TABLE、SELECT 和 CREATE TABLE 语句。
安全原则
下表描述适用于临时表的安全原则:
| 原则 | 说明 |
|---|---|
| 启用/禁用系统版本控制需要有对受影响对象的最高权限 | 启用和禁用 SYSTEM_VERSIONING 需要在当前表和历史表上均具有 CONTROL 权限。 |
| 不能直接修改历史记录数据 | 当 SYSTEM_VERSIONING 是 ON时,用户无论在当前或历史表上的权限如何,都不能更改历史数据。 此限制包括数据和架构修改。
1 |
查询历史记录数据需要有对历史记录表的 SELECT 权限 |
对当前表具有 SELECT 权限的用户不会自动对历史记录表具有 SELECT 权限。 |
| 审计揭示了以特定方式影响历史表的操作 | 当前表中的审核设置不会自动应用于历史记录表。 你必须为历史表明确启用审计功能。 启用后,历史表上的审计会记录所有直接访问数据的尝试,无论是否成功。SELECT 带有时间查询扩展,显示该操作影响了历史表。CREATE/ALTER 时态表表明,权限检查也会在历史记录表上进行。 审计文件包含历史表的附加记录。对当前表执行的数据操作语言 (DML) 操作表明,该操作影响了历史表,但 additional_information 提供了必要的上下文信息(DML 是 SYSTEM_VERSIONING 的结果)。 |
1 如果你对当前表和历史表都有 ALTER 权限,并且你在当前表中丢弃了一列,那么历史表中关联的列也会被丢弃,即使 SYSTEM_VERSIONING 是 ON。
执行架构操作
SYSTEM_VERSIONING 设置为 ON 时,架构修改操作将受限制。
禁止的 ALTER SCHEMA 操作
| 运算 | 当前表 | 历史记录表 |
|---|---|---|
DROP TABLE |
已禁止 | 已禁止 |
ALTER TABLE...SWITCH PARTITION |
SWITCH IN 仅限于(请参阅使用时态表进行分区) |
SWITCH OUT 仅限于(请参阅使用时态表进行分区) |
ALTER TABLE...DROP PERIOD |
禁止 | N/A |
ALTER TABLE...ADD PERIOD |
N/A | 已禁止 |
允许的 ALTER TABLE 操作
| 运算 | Current | History |
|---|---|---|
ALTER TABLE...REBUILD |
允许(独立) | 允许(独立) |
CREATE INDEX |
允许(独立) | 允许(独立) |
CREATE STATISTICS |
允许(独立) | 允许(独立) |
CREATE 时态表语句的安全性
| Feature | 创建新的历史记录表 | 重用现有的历史记录表 |
|---|---|---|
| 所需权限 | 数据库中的 CREATE TABLE 权限对创建当前表和历史表所在的架构的 ALTER 权限 |
数据库中的 CREATE TABLE 权限对创建当前表所在架构的 ALTER 权限。CONTROL 权限,针对在创建时序表的 CREATE TABLE 语句中指定的历史表。 |
| Audit | 审核显示用户尝试创建两个对象。 操作可能因缺乏创建数据库表的权限,或缺乏修改任一表模式的权限而失败。 | 审核显示已创建时态表。 操作可能由于缺少在数据库中创建表的权限、缺少改变时态表架构的权限或缺少对历史记录表的权限而失败。 |
ALTER 时态表 SET (SYSTEM_VERSIONING) 语句的安全性
| Feature | 创建新的历史记录表 | 重用现有的历史记录表 |
|---|---|---|
| 所需权限 | 数据库中的 CONTROL 权限。数据库中的 CREATE TABLE 权限。对创建历史表的所在架构的 ALTER 权限。 |
对所修改的原始表的 CONTROL 权限。CONTROL 权限,针对作为 ALTER TABLE 语句一部分指定的历史表。 |
| Audit | 审核显示临时表已更改,同时创建了历史记录表。 该操作可能因缺乏创建数据库表的权限、修改历史表模式的权限,或修改时序表的权限而失败。 | 审核显示已更改时态表,但操作需要对历史记录表的访问权限。 操作可能由于缺少对历史记录表或当前表的权限而失败。 |
SELECT 语句的安全性
对于不影响历史记录表的 SELECT 语句,SELECT 权限保持不变。 对于 SELECT 影响历史表的语句,你需要对当前表和历史表同时获得 SELECT 权限。