Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 从与同一行相关但仅显示允许字段的表中选择字段_Sql Server 2005_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 2005 从与同一行相关但仅显示允许字段的表中选择字段

Sql server 2005 从与同一行相关但仅显示允许字段的表中选择字段,sql-server-2005,tsql,sql-server-2008,Sql Server 2005,Tsql,Sql Server 2008,您好,我有这个表的字段:Employees 身份证,名,姓,生日 我想对一些字段保密,所以我创建了这个包含这些字段的表 tableName、ColumnName、PrivacyType[可见/不可见] 当从第一个表中选择一行时,我不想得到具有 隐私类型=不可见 任何想法好吧,尽管我非常讨厌动态sql,但我想不出一种方法,没有它你可以做你想做的事情。我强烈建议您考虑另一种方法来实现您想要的,或者通过其他方式设计数据库,或者让另一个应用程序来解决隐私列。在任何情况下,您都可以使用动态sql执行您要求

您好,我有这个表的字段:Employees

身份证,名,姓,生日

我想对一些字段保密,所以我创建了这个包含这些字段的表

tableName、ColumnName、PrivacyType[可见/不可见]

当从第一个表中选择一行时,我不想得到具有 隐私类型=不可见


任何想法

好吧,尽管我非常讨厌动态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