Sql server 2005 从与同一行相关但仅显示允许字段的表中选择字段
您好,我有这个表的字段:Employees 身份证,名,姓,生日 我想对一些字段保密,所以我创建了这个包含这些字段的表 tableName、ColumnName、PrivacyType[可见/不可见] 当从第一个表中选择一行时,我不想得到具有 隐私类型=不可见Sql server 2005 从与同一行相关但仅显示允许字段的表中选择字段,sql-server-2005,tsql,sql-server-2008,Sql Server 2005,Tsql,Sql Server 2008,您好,我有这个表的字段:Employees 身份证,名,姓,生日 我想对一些字段保密,所以我创建了这个包含这些字段的表 tableName、ColumnName、PrivacyType[可见/不可见] 当从第一个表中选择一行时,我不想得到具有 隐私类型=不可见 任何想法好吧,尽管我非常讨厌动态sql,但我想不出一种方法,没有它你可以做你想做的事情。我强烈建议您考虑另一种方法来实现您想要的,或者通过其他方式设计数据库,或者让另一个应用程序来解决隐私列。在任何情况下,您都可以使用动态sql执行您要求
任何想法好吧,尽管我非常讨厌动态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)
通常,如果需要对(一组)用户隐藏某些列/行,则需要为它们实现一个视图。然后拒绝在基表上选择。视图定义将只引用那些您想让您在视图上授予SELECT权限的用户组可以访问的列 正如我所说,一旦通过视图进行访问,就可以实现更复杂的需求,例如行级安全性 (如果设置了动态更改隐私设置,您可以在视图中做一些不好的事情,但我不建议这样做): 结果:
ID Col1 Col2 Col3
1 abc ghi
2 ZYX TSR
你认为这比以前的解决方案快吗?@feras-就像我说的,我只需要为适当的列定义静态视图,并授予用户访问它们的权限。我只会在非常不寻常的情况下做一个动态解决方案(比如上面的代码),如果我做的话,我知道性能永远不会很高。
ID Col1 Col2 Col3
1 abc ghi
2 ZYX TSR