2009-02-06 15 views
3

我有两个Microsoft SQL Server 2000数据库,一个存储过程试图从另一个数据库读取数据。这用于正常工作,但由于我变得注重安全性并将登录(SQL用户)从“db owner”更改为“denydatareader”,调用失败。为什么存储过程无法从另一个数据库读取表(我必须错误地使用GRANT和DENY)

如果我使用“datareader”组,可以使事情正常工作,但由于我不希望此登录对用户表具有读访问权限(ASP仅使用特效),所以我认为这是不明智的。如果我将用户从所有组中取出,它也可以工作!这个可以吗?


一个数据库被称为'内部',并有一个名为'东西'的表。 另一个名为'WebFacing',并有一个名为'Get_Some_Data'的存储过程,它从'Internal..Stuff'中进行选择。

我的内部数据库上运行此命令:
GRANT SELECT ON Stuff TO magnus

我跑这一个面向卷筒纸数据库:
GRANT EXECUTE ON Get_Some_Data TO magnus

我的ASP使用的SQL登录“马格努斯”,并连接到' WebFacing'数据库。 当它试图Exec中的程序,它用错误:
SELECT permission denied on object 'Stuff', database 'Internal', owner 'dbo'.


(道歉,如果这是一个愚蠢的问题,但我已经在深水的一端被推倒,只有了解了授予和拒绝昨天。我尝试过使用谷歌搜索...)

+0

我想我是问我的登录/用户应该在一个组中,还是可以成为“公共”的成员? – 2009-02-06 15:00:28

+0

您的数据库是否在SQL Server的同一实例上运行,或者它们在不同的实例/服务器上运行? – Eppz 2009-02-06 19:05:26

+0

相同的服务器,相同的实例 – 2009-02-10 11:15:47

回答

3

将SQL登录与组/角色(或不是)关联起来对于需要跟踪数据库权限的人来说更方便。由于您对所有这些都是陌生的,因此在担心通过组/角色管理权限之前,我会首先专注于获取特定登录的权限。

当我第一次开始使用SQL Server权限时,给了我的东西之一就是理解用于执行存储过程的权限是否是用于调用过程的SQL登录名的权限,或SQL登录与创建proc本身相关联。这个术语(该组证书和相关权限用于执行proc代码)被称为存储过程所运行的“安全上下文”。我最近一直在使用MySQL,但是如果我没有记错的话,用于在SQL Server上执行存储过程的默认安全上下文就是CALLER而不是proc所有者。这总是让我感到违反直觉,因为在我看来,使用存储过程的一个关键优势应该是只能授予对CALLER登录的特定过程的EXEC权限。但是当我试图这样做时,我不可避免地会获得权限错误,因为我用来调用proc的凭据将不具备完成存储过程中包含的一个或多个操作所需的权限。

如果您正在使用SQL Server 2005并希望只能授予CALLER凭证的EXEC权限,那么this文章可能会帮助您了解如何实现这一点。在我看来,这是“正确”的做事方式,尽管我确信也许有人可能会不同意(尽管我可能会坚持我的观点)。

无论如何,我不知道我已透过这篇文章澄清了这个问题。当你首先研究整个问题时,SQL Server权限管理确实有点深刻。这不会让你更容易处理跨多个数据库的设置问题。

0

当您转到同一实例上的其他数据库时,在允许运行之前,每个“commmand”对同一上下文中由目标数据库评估的表和视图拥有权限。

这与完全位于与SP完全相同的数据库中不同,其中SP对于您具有EXEC权限的表中所引用的表不需要SELECT表。

您可以使用EXECUTE AS作为拥有权限的人来执行,或者另一种选择是在仅返回所需列的第二个数据库中创建VIEW,或者在表上设置列级权限,或者创建一个SP并调用它(你将不得不将结果插入临时表中,所以效率不是很高)。

+0

EXECUTE AS仅适用于SQL2005我认为?我应该说我正在使用SQL2000。但谢谢你澄清第一点。 – 2009-02-11 13:44:10

1

您可以启用Croos数据库的所有权,而无需在您的存储过程正在调用的表上给予选择权限。但使用风险自负。我用它为你所描述的scenraio:

ALTER DATABASE DBNAME集db_chaining上

0

连接字符串的用户!

绝对是一个权限问题,但是谁?

对我来说,调用存储过程(试图)访问不同数据库中的表, 这是连接字符串中的用户必须具有GRANT权限。

相关问题