【发布时间】:2017-01-18 09:57:57
【问题描述】:
如何参数化 SQL REVOKE 命令?
DECLARE @ViewName nvarchar = 'MyViewName'
DECLARE @UserRole nvarchar = 'MyRoleName'
REVOKE SELECT ON [@ViewName] TO [@UserRole]
输出以下错误:
Cannot find the object '@ViewName', because it does not exist or you do not have permission.`
我需要使用动态 SQL 来解决这个问题还是有其他方法?
我的实际用例在 ASP.NET SqlDataClient 中,并且正在生成代码,因此我对它的控制有限。发送到 SQL 的代码(由 SQL Profiler 嗅探)是:
exec sp_executesql N'REVOKE SELECT ON [@ViewName] TO [@UserRole]',N'@ViewName nvarchar(24),@UserRole nvarchar(12)',@ViewName=N'MyViewName',@UserRole=N'MyUserRole'
【问题讨论】:
-
你必须使用动态sql。
-
因为
GRANT和REVOKE本身需要相当多的权限,所以在构建动态SQL 并可以在不同凭据下执行命令的存储过程中执行此操作通常很有吸引力。这样,您可以通过控制对存储过程的访问来选择性地将权限分配给REVOKE,如果这成为要求,则添加审核,最后但并非最不重要的是,您可以继续使用参数。 -
@JeroenMostert 这听起来像是正确的答案。如果您将其作为答案并添加一个小示例,那么我将其标记为正确。
标签: asp.net sql-server sqldatasource