时态表安全性
适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例
要了解适用于时态表的安全性,则必须了解适用于时态表的安全主体。 在了解这些安全原则后,就可以准备深入研究关于 CREATE TABLE
、ALTER TABLE
和 SELECT
语句的安全性了。
安全原则
下表描述适用于临时表的安全原则:
原则 | 说明 |
---|---|
启用/禁用系统版本控制需要有对受影响对象的最高权限 | 启用和禁用 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 架构操作
操作 | 当前表 | 历史记录表 |
---|---|---|
DROP TABLE |
已禁止 | 已禁止 |
ALTER TABLE...SWITCH PARTITION |
仅 SWITCH IN (参阅时态表分区) |
仅 SWITCH OUT (参阅时态表分区) |
ALTER TABLE...DROP PERIOD |
已禁止 | 空值 |
ALTER TABLE...ADD PERIOD |
空值 | 已禁止 |
允许的 ALTER TABLE 操作
操作 | 当前 | 历史记录 |
---|---|---|
ALTER TABLE...REBUILD |
已允许(独立) | 已允许(独立) |
CREATE INDEX |
已允许(独立) | 已允许(独立) |
CREATE STATISTICS |
已允许(独立) | 已允许(独立) |
CREATE Temporal TABLE 语句的安全性
功能 | 创建新的历史记录表 | 重用现有的历史记录表 |
---|---|---|
所需权限 | 数据库中的 CREATE TABLE 权限在其中创建当前表和历史记录表的架构上的 ALTER 权限 |
数据库中的 CREATE TABLE 权限将在其中创建当前表的架构上的 ALTER 权限。作为创建时态表的 CONTROL 语句一部分指定的历史记录表 CREATE TABLE 权限。 |
审核 | 审核显示用户尝试创建两个对象。 操作可能由于缺少在数据库中创建表的权限或缺少改变任一表架构的权限而失败。 | 审核显示已创建时态表。 操作可能由于缺少在数据库中创建表的权限、缺少改变时态表架构的权限或缺少对历史记录表的权限而失败。 |
ALTER Temporal TABLE SET (SYSTEM_VERSIONING ON/OFF) 语句的安全性
功能 | 创建新的历史记录表 | 重用现有的历史记录表 |
---|---|---|
所需权限 | 数据库中的 CONTROL 权限。数据库中的 CREATE TABLE 权限。在其中创建历史记录表的架构上的 ALTER 权限。 |
更改的原始表上的 CONTROL 权限。作为 CONTROL 语句一部分指定的历史记录表 ALTER TABLE 权限。 |
审核 | 审核显示临时表已更改,同时创建了历史记录表。 操作可能由于缺少在数据库中创建表的权限、缺少改变历史记录表架构的权限或缺少修改时态表的权限而失败。 | 审核显示已更改时态表,但操作需要对历史记录表的访问权限。 操作可能由于缺少对历史记录表或当前表的权限而失败。 |
SELECT 语句的安全性
SELECT
权限对不影响历史记录表的 SELECT
语句不变。 对于影响历史记录表的 SELECT
语句,在当前表和历史记录表上都需要 SELECT
权限。