2009-11-06 112 views
0

我希望能够拥有一个只能从特定页面使用的存储过程,而无需为用户创建权限/角色,而只需要以这种方式访问​​单个存储过程。如何控制对SQL Server中存储过程的访问?

例如我想要一个proc_GetCustomerItems存储过程,它接受CustomerID的参数,然后返回客户已购买的项目列表,但是我希望这仅适用于列出客户项目的地方,例如。 ASP页面显示这个列表,但不能从其他任何地方工作,如查询分析器等。
这是用另一个参数来提供额外的安全信息,基本问题是如何只允许某些方法和页面访问一个存储过程,这可以通过角色或权限来完成吗?

主要问题是如何正确设置存储过程对代码中特定方法的访问权限,这将有助于强制使用所述存储过程,因此必须明确允许GetCustomerItems方法(在ASP中为例如)使用此存储过程的权限。

我猜测角色和用户访问将成为建议的替代方案,但我会感兴趣的是,如果可以通过调用存储过程来限制对存储过程的访问,我会感兴趣。

回答

0

很难知道它是否适合您,通常我是亲存储过程,但我可以建议的唯一选择是您不使用存储过程。

取而代之的是,使用来自相关页面的参数化sql。这样,就没有存储过程存在从其他地方使用。

这意味着,如果不是这样的话,那么正在使用的用户帐户将需要对基础表的直接权限。

3

不,这是不可能的。离我最近的我可以想象,只有访问某个存储过程的页面才能使用来自其他页面的不同凭据。如果您希望人们不使用查询分析器访问proc,则可以使用标准的SQL Server安全性功能。

+0

我有一种感觉,情况是这样,但我想我会问,因为这是我想知道作为一种可能的选择。无论如何,这可能很有用,因为它显示SQL安全功能可以基于连接提供此功能,该页面可以像上述那样使用该功能。 – RoguePlanetoid 2009-11-06 15:03:37

0

,你可以得到将代码添加到您的存储过程的开始处查询APP_NAME()HOST_NAME()HOST_ID()值最接近,CURRENT_USER也许还有其他,如果有任何与您的应用程序的相关值不匹配,则只返回NULL或空行。这当然不会是页面特定的,并且也不会有任何东西阻止某人使用查询分析器来查看存储过程本身的内容。

+0

感谢您的提问,问题的主要目的是在允许的情况下查看页面是否可以使用存储过程,而不是之前。当存储过程的上下文必须仅为Page时,这可能会有用。 – RoguePlanetoid 2009-11-06 15:14:17

+0

那么,你也可以让该页面以不同的凭据运行sp到其他地方,或者只是将该页面的连接字符串中的ApplicationName修改为唯一的“block”其他所有内容。 – MartW 2009-11-06 15:25:03