Sql 忽略“中被拒绝的列”;选择*from";

Sql 忽略“中被拒绝的列”;选择*from";,sql,sql-server,access-denied,Sql,Sql Server,Access Denied,我需要限制(支持)用户查看表中的列(其他用户应具有此表的完全访问权限)。 因此,我仅通过“将dbo.TestTable上的SELECT(FirstCol、SecondCol、ThirdCol)授予HR_Intern;”授予我指定的列访问权限 但是,当我运行“SELECT*FROM dbo.TestTable;””时,对于表中的每一列,我都会收到一个拒绝访问错误。 用户直接在数据库上使用MSSQL Management Studio进行客户支持,错误将不允许用户编辑数据 是否可以只显示用户有权访问

我需要限制(支持)用户查看表中的列(其他用户应具有此表的完全访问权限)。 因此,我仅通过“
将dbo.TestTable上的SELECT(FirstCol、SecondCol、ThirdCol)授予HR_Intern;”
授予我指定的列访问权限

但是,当我运行“
SELECT*FROM dbo.TestTable;”
”时,对于表中的每一列,我都会收到一个拒绝访问错误。 用户直接在数据库上使用MSSQL Management Studio进行客户支持,错误将不允许用户编辑数据

是否可以只显示用户有权访问的列并忽略每个被拒绝的列


谢谢您的帮助:)

不。这就是SQL中的安全工作原理。基本上,“SELECT*”不是一个好的形式,应该提供一个字段列表

如果结果集根据登录的用户而神奇地改变,那么会导致大量糟糕的错误报告,因为应用程序会突然停止工作。您要求提供无法发送的所有字段,因此生成了错误报告


一种解决方法是使用具有有限字段数的视图,并指导该用户使用这些视图。显然,这会在开发过程中耗费时间和精力。

不。这就是SQL中安全性的工作方式。基本上,“SELECT*”不是一个好的形式,应该提供一个字段列表

如果结果集根据登录的用户而神奇地改变,那么会导致大量糟糕的错误报告,因为应用程序会突然停止工作。您要求提供无法发送的所有字段,因此生成了错误报告


一种解决方法是使用具有有限字段数的视图,并指导该用户使用这些视图。显然,这会在开发过程中耗费时间和精力。

不。这就是SQL中安全性的工作方式。基本上,“SELECT*”不是一个好的形式,应该提供一个字段列表

如果结果集根据登录的用户而神奇地改变,那么会导致大量糟糕的错误报告,因为应用程序会突然停止工作。您要求提供无法发送的所有字段,因此生成了错误报告


一种解决方法是使用具有有限字段数的视图,并指导该用户使用这些视图。显然,这会在开发过程中耗费时间和精力。

不。这就是SQL中安全性的工作方式。基本上,“SELECT*”不是一个好的形式,应该提供一个字段列表

如果结果集根据登录的用户而神奇地改变,那么会导致大量糟糕的错误报告,因为应用程序会突然停止工作。您要求提供无法发送的所有字段,因此生成了错误报告


一种解决方法是使用具有有限字段数的视图,并指导该用户使用这些视图。显然,这会在开发过程中耗费时间和精力。

最好创建一个
视图
,并为用户提供对它的访问。在
视图中
只有这些用户可以看到的列应该是
SELECT
语句的一部分

最好创建一个
视图
,并为用户提供对该视图的访问。在
视图中
只有这些用户可以看到的列应该是
SELECT
语句的一部分

最好创建一个
视图
,并为用户提供对该视图的访问。在
视图中
只有这些用户可以看到的列应该是
SELECT
语句的一部分

最好创建一个
视图
,并为用户提供对该视图的访问。在
视图中
只有这些用户可以看到的列应该是
SELECT
语句的一部分

正如其他人指出的,您需要用显式选择列表替换
*
。 如果您担心必须指定两次,那么下面是一个从元数据检索允许列列表的查询。 如果愿意,可以使用其结果集为
TestTable
上的查询生成(部分)选择列表

SELECT c.name
FROM sys.columns c
INNER JOIN sys.database_permissions p
    ON p.class = 1
    AND p.major_id = c.object_id
    AND p.minor_id = c.column_id
    AND p.state = 'G'
    AND p.grantee_principal_id = DATABASE_PRINCIPAL_ID('HR_Intern')
WHERE c.object_id = OBJECT_ID('dbo.TestTable')
DATABASE\u PRINCIPAL\u ID()
替换
DATABASE\u PRINCIPAL\u ID('HR\u Intern')
,以获取当前活动用户的元数据


这个问题仍然相当粗糙;它无视全桌拨款,所有人都予以否认。您可能想尝试一下。

正如其他人指出的,您需要用显式选择列表替换
*
。 如果您担心必须指定两次,那么下面是一个从元数据检索允许列列表的查询。 如果愿意,可以使用其结果集为
TestTable
上的查询生成(部分)选择列表

SELECT c.name
FROM sys.columns c
INNER JOIN sys.database_permissions p
    ON p.class = 1
    AND p.major_id = c.object_id
    AND p.minor_id = c.column_id
    AND p.state = 'G'
    AND p.grantee_principal_id = DATABASE_PRINCIPAL_ID('HR_Intern')
WHERE c.object_id = OBJECT_ID('dbo.TestTable')
DATABASE\u PRINCIPAL\u ID()
替换
DATABASE\u PRINCIPAL\u ID('HR\u Intern')
,以获取当前活动用户的元数据


这个问题仍然相当粗糙;它无视全桌拨款,所有人都予以否认。您可能想尝试一下。

正如其他人指出的,您需要用显式选择列表替换
*
。 如果您担心必须指定两次,那么下面是一个从元数据检索允许列列表的查询。 如果愿意,可以使用其结果集为
TestTable
上的查询生成(部分)选择列表

SELECT c.name
FROM sys.columns c
INNER JOIN sys.database_permissions p
    ON p.class = 1
    AND p.major_id = c.object_id
    AND p.minor_id = c.column_id
    AND p.state = 'G'
    AND p.grantee_principal_id = DATABASE_PRINCIPAL_ID('HR_Intern')
WHERE c.object_id = OBJECT_ID('dbo.TestTable')
DATABASE\u PRINCIPAL\u ID()
替换
DATABASE\u PRINCIPAL\u ID('HR\u Intern')
,以获取当前活动用户的元数据


这个问题仍然相当粗糙;它无视全桌拨款,所有人都予以否认。您可能想尝试一下。

正如其他人指出的,您需要用显式选择列表替换
*
。 如果您担心必须指定两次,那么下面是一个从元数据检索允许列列表的查询。 如果愿意,可以使用其结果集为
TestTable
上的查询生成(部分)选择列表

SELECT c.name
FROM sys.columns c
INNER JOIN sys.database_permissions p
    ON p.class = 1
    AND p.major_id = c.object_id
    AND p.minor_id = c.column_id
    AND p.state = 'G'
    AND p.grantee_principal_id = DATABASE_PRINCIPAL_ID('HR_Intern')
WHERE c.object_id = OBJECT_ID('dbo.TestTable')
DATABA替换
DATABASE\u PRINCIPAL\u ID('HR\u Intern')