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')