适用于: SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
要了解适用于时态表的安全性,则必须了解适用于时态表的安全主体。 在了解这些安全原则后,就可以准备深入研究关于 CREATE TABLE、ALTER TABLE 和 SELECT 语句的安全性了。
安全原则
下表描述适用于临时表的安全原则:
| Principle | Description |
|---|---|
| 启用/禁用系统版本控制需要有对受影响对象的最高权限 | 启用和禁用 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 架构操作
| Operation | 当前表 | 历史记录表 |
|---|---|---|
DROP TABLE |
Disallowed | Disallowed |
ALTER TABLE...SWITCH PARTITION |
SWITCH IN 仅限于(请参阅使用时态表进行分区) |
仅限 SWITCH OUT(请参阅时态表分区) |
ALTER TABLE...DROP PERIOD |
Disallowed | N/A |
ALTER TABLE...ADD PERIOD |
N/A | Disallowed |
允许的 ALTER TABLE 操作
| Operation | 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 ON/OFF)语句的安全性
| Feature | 创建新的历史记录表 | 重用现有的历史记录表 |
|---|---|---|
| 所需权限 | 数据库中的 CONTROL 权限。数据库中的 CREATE TABLE 权限。ALTER 权限,针对历史表将被创建的模式。 |
CONTROL 权限,针对被修改的原始表。CONTROL 权限,针对作为 ALTER TABLE 语句一部分指定的历史表。 |
| Audit | 审核显示临时表已更改,同时创建了历史记录表。 操作可能由于缺少在数据库中创建表的权限、缺少改变历史记录表架构的权限或缺少修改时态表的权限而失败。 | 审核显示已更改时态表,但操作需要对历史记录表的访问权限。 操作可能由于缺少对历史记录表或当前表的权限而失败。 |
SELECT 语句的安全性
对于不影响历史记录表的 SELECT 语句,SELECT 权限保持不变。 对于影响历史记录表的 SELECT 语句,在当前表和历史记录表上都需要 SELECT 权限。