我在同一个SQL2008服务器上有两个数据库,一个数据库上的许多存储过程(称为A)需要访问另一个数据库(B)上的表。我确保A上的SQL用户有权在A上执行EXEC,但我也运行了DENY ALL ON mytablename
来尝试安全性。我虽然在某处愚蠢......
在A:上运行myproc时出现此错误
Microsoft OLE DB Provider for ODBC Drivers错误'80040e09'
[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]对象'mytablename',数据库'B',架构'dbo'上的SELECT权限被拒绝。 的
虽然我可以GRANT SELECT
访问相关表格,但这不是解决方案,是吗?!我希望任一数据库上的proc都能对表进行SELECT访问,而无需用户直接从表中进行SELECT。
数据库A具有:
表 - mytablename
用户 - myuserA(db_datareader的成员,链接到名为'bob'的登录名)
数据库B有:
Proc - myproc(从A..mytablename中选择)
用户 - myuserB(db_datareader的成员,链接到同一登录'bob')
我意识到我们真的需要一名DBA,但我们只有两名员工!
答案 0 :(得分:1)
通过运行DENY ALL ON table
,无论是否明确授予SELECT,都有效地拒绝权限。丹尼胜过一切。
然后,您要做的是在数据库B上创建视图,并将SELECT授予可以在数据库A上运行SP的用户。当运行DB A上的SP时,安全性将从DB A传播到DB B. / p>