Dmi*_*mov 2 sql-server materialized-view sql-server-2016 data-masking dynamic-data-masking
我正在尝试在引用带有屏蔽列的表(SQL Server 2016)的视图上创建索引。屏蔽列不是该表中唯一的列,并且未在视图中使用。
create unique clustered index [IX_Name]
on dbo.vw_ViewName(SomeUniqueId)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
无法创建视图“dbo.vw_ViewName”上的索引,因为该视图正在引用带有屏蔽列的表“dbo.TableName”。
在另一个未启用屏蔽的环境中,索引创建成功。
我浏览了大约四页的 Google 结果,但没有找到任何合理的错误描述。我很感激任何关于错误的知识转移以及为什么不可能创建这样的索引。
这是一些重现问题的 SQL:
drop view if exists dbo.vw_Aggregate
drop table if exists dbo.MainTable, dbo.SecondaryTable
go
create table dbo.MainTable
(
MainTableId uniqueidentifier primary key,
SomeExternalId uniqueidentifier,
SecondaryTableId uniqueidentifier
)
go
create table dbo.SecondaryTable
(
SecondaryTableId uniqueidentifier primary key,
CreatedOn datetime,
Amount decimal(19, 8),
-- the below column produces error,
-- if commented out - there is no error
[Description] nvarchar(max) masked with (function = 'default()'),
Dummy int
)
go
create view dbo.vw_Aggregate with schemabinding
as
select AggregateId = m.MainTableId,
m.SomeExternalId,
s.CreatedOn,
s.Amount
from dbo.MainTable m
inner join dbo.SecondaryTable s on s.SecondaryTableId = m.SecondaryTableId
go
create unique clustered index [IX_dbo.vw_Aggregate(AggregateId)]
on dbo.vw_Aggregate(AggregateId)
go
Run Code Online (Sandbox Code Playgroud)
据我所知,这是不支持的,在这种情况下你只能使用表。
如以下文章中所见,该文章使用了与动态数据屏蔽不同的行级安全性,但它可能相互链接。
https://www.mssqltips.com/sqlservertip/4005/sql-server-2016-row-level-security-limitations-performance-and-troubleshooting/作者:Aaron Bertrand:
索引视图
行级安全性与具有索引视图的表不兼容。如果您尝试针对具有安全策略的表创建索引视图,您将收到以下错误:
消息 33266,级别 16 无法创建视图 'view' 上的索引,因为该视图正在引用安全策略引用的表 'table'。
不,你不能一成不变地解决这个问题;如果表被索引视图引用,则无法应用安全策略:
消息 33265,级别 16 安全策略 'policy' 不能在表 'table' 上有谓词,因为该表被索引视图 'view' 引用。
注意:如果尝试将安全策略应用于分区视图引用的表,您可能会遇到相同类型的问题。
由于动态数据屏蔽和行级安全性是在同一个版本中发布的,因此这些限制可能相互关联。
错误
该错误还明确指出,不允许在链接到具有屏蔽列的表的视图上建立索引。然而,在文档中找不到关于它的任何内容。
所以我的猜测是它不受支持。
归档时间: |
|
查看次数: |
1555 次 |
最近记录: |