Выбор полей из таблицы, относящихся к той же строке, но с отображением только разрешенных полей - PullRequest
0 голосов
/ 29 декабря 2010

привет, предположим, у меня есть поля этой таблицы: Сотрудники

идентификатор, имя, фамилия, дата рождения

, и я хочу сохранить конфиденциальность в некоторых полях, поэтому я создал эту таблицу, содержащую эти поля

tableName, ColumnName, PrivacyType [Visible / Notvisible]

и при выборе строки из первой таблицы я не хочу получать поля с типом приватности = NotVisible

любая идея

Ответы [ 2 ]

0 голосов
/ 29 декабря 2010

Как правило, если вам нужны некоторые столбцы / строки, скрытые от (набора) пользователей, вы бы реализовали представление для них.Затем вы запретили бы 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
0 голосов
/ 29 декабря 2010

Ну, так как я ненавижу динамический sql, я не могу придумать, как вы могли бы делать то, что вы хотите без него.Я настоятельно рекомендую вам подумать о другом способе достижения того, чего вы хотите, либо путем создания своей базы данных другим способом, либо с помощью другого приложения для решения колонок конфиденциальности.В любом случае, вы можете делать то, что вы просили, с динамическим sql.

DECLARE @Table VARCHAR(100) @Columns VARCHAR(MAX), @Query VARCHAR(MAX)
SET @Columns = ''
SET @Table = 'Employees'

SELECT @Columns = @Columns + '[' + A.COLUMN_NAME + '],'
FROM INFORMATION_SCHEMA.COLUMNS A
INNER JOIN PrivacyTable B
A.TABLE_NAME = B.TableName AND A.COLUMN_NAME = B.ColumnName
WHERE A.TABLE_NAME = @Table AND B.PrivacyType = 'Visible'
ORDER BY A.ORDINAL_POSITION

SET @Columns = LEFT(@Columns,LEN(@Columns)-1)

SET @Query = 'SELECT ' + @Columns + ' FROM [' + @Table + ']'

EXEC(@Query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...