Как правило, если вам нужны некоторые столбцы / строки, скрытые от (набора) пользователей, вы бы реализовали представление для них.Затем вы запретили бы SELECT на базовом столе.Определение представления будет ссылаться только на те столбцы, которые вы хотите сделать доступными для группы пользователей, которым вы предоставляете SELECT для представления.
Как только вы получите доступ к представлениям, как я уже сказал, вы можете реализовать более сложныетребования, такие как безопасность на уровне строк.
(Вы можете сделать что-то некрасивое в своих представлениях, если настроены динамические изменения параметров конфиденциальности, но я бы не рекомендовал это):
create table dbo.T1 (
ID int not null,
Col1 varchar(10) not null,
Col2 varchar(10) not null,
Col3 varchar(10) not null
)
go
create table dbo.Privacy (
Schemaname sysname not null,
Tablename sysname not null,
Columnname sysname not null,
Hidden bit not null
)
go
insert into dbo.T1 (ID,Col1,Col2,Col3)
select 1,'abc','def','ghi' union all
select 2,'ZYX','WVU','TSR'
go
insert into dbo.Privacy (Schemaname,Tablename,Columnname,Hidden)
select 'dbo','T1','Col2',1
go
create function dbo.ShowColumn (
@Schema sysname,
@Table sysname,
@Column sysname
)
returns int
as
begin
if exists(select * from dbo.Privacy where Schemaname = @Schema and Tablename = @Table and Columnname = @Column and Hidden=1)
begin
return 0
end
return 1
end
go
create view dbo.Virtual_T1 (ID,Col1,Col2,Col3)
as
select
ID,
CASE WHEN 1 = dbo.ShowColumn('dbo','T1','Col1') THEN Col1 ELSE '' END,
CASE WHEN 1 = dbo.ShowColumn('dbo','T1','Col2') THEN Col2 ELSE '' END,
CASE WHEN 1 = dbo.ShowColumn('dbo','T1','Col3') THEN Col3 ELSE '' END
from
dbo.T1
go
select * from dbo.Virtual_T1
Результат:
ID Col1 Col2 Col3
1 abc ghi
2 ZYX TSR