SQL Server 执行权限;应用权限失败

7

我刚从SQL2000迁移到了SQL2008,现在遇到了一个执行权限问题,这个问题出现在使用sp_OACreate的存储过程上。

其余部分的系统能够正常工作,使用已设置并添加到数据库中的db登录信息。

我尝试过:

USE master
GO
GRANT EXEC ON sp_OACreate TO [dbuser]
GO

但是这会出现以下错误:

Msg 15151,Level 16,State 1,Line 1 无法找到用户'dbuser',因为它不存在或您没有权限。

我使用具有完全权限的 sa 帐户登录到服务器上。我可以执行类似的 SQL 语句并将权限应用于服务器角色,但不能应用于登录/用户。
如何将更改应用于特定的用户/登录?
我可以将权限应用于公共角色,并解决我的问题。然而,对于我来说,这似乎是一个安全问题,我不想将其应用于生产服务器。
5个回答

6
这个错误提示表明在主数据库中不存在用户“dbuser”。
我猜测该用户存在于主数据库中?
您可以使用以下 T-SQL 进行检查。
USE MASTER;
GO

SELECT *
FROM sys.sysusers
WHERE name = 'dbuser'

如果用户不存在,只需使用CREATE USER语句创建一个名为“dbuser”的用户。该用户将自动映射到同名的登录名(如果存在)。

谢谢您的回复。它在sysusers表中不存在。如何重新添加? - WestDiscGolf
好的,我重新添加了用户并将其与dbuser登录相关联。然后我已经向该用户授予权限。 :-) - WestDiscGolf
@WestDiscGolf:好消息,很高兴能够帮助。 - John Sansom
谢谢John提供的指引。我已经添加了一个答案,以备将来参考。对于这些指引,我点了+1个赞。 - WestDiscGolf

6

继承John的答案,我检查了主数据库上的用户列表,但我的用户不在那里。我不知道它是否已被删除或遗失。也许在将dbs迁移到新服务器实例时出现了一些问题。

无论如何,重新创建用户并将其与特定登录关联,使我能够在主数据库上运行以下语句,以允许执行存储过程。

USE MASTER
GO

GRANT EXECUTE ON [sys].[sp_OADestroy] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OACreate] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [dbuser]
GO
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [dbuser]
GO

感谢您提供的所有帮助和指引。希望这篇文章能够帮助其他人在未来更好地理解相关内容。

你是如何迁移你的数据库的?如果你没有还原主数据库,那么用户“dbuser”将不存在,因此无法映射。 - John Sansom
@John - 你说得对。由于一些历史上的问题,我们在迁移过程中没有恢复主数据库。不幸的是,我们也丢失了用户,现在已经重新创建并映射到登录名 :-) - WestDiscGolf

2
你的问题可能与孤立用户有关。
尝试执行以下操作:
USE MASTER
GO
EXEC sp_change_users_login 'Report'

这将每个孤立用户名称返回一行。然后,
EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser'

谢谢您的回复。我已在服务器上运行了第一个命令,但查询未返回任何记录。 - WestDiscGolf
感谢您在正确的方向上提供帮助。+1 :-) - WestDiscGolf

2

这里是我正在使用的代码,用于验证(当前用户)是否对sp_OACreate等具有执行权限:

use master;
select state_desc,name from
sys.database_permissions a
left join
sys.all_objects b
on a.major_id = b.object_id
where name like 'sp_OA%';

如@John Sansom和@WestDiscGolf所指出的,用户必须存在于主数据库中,并且必须在主数据库中被授予权限,因此需要使用use Master。如果用户具有执行权限,则上述查询将返回记录,否则将返回空集合。(在用户数据库中执行也会返回空集合。)
我无法找到一种使用fn_my_permissions检查这些权限的方法,尽管它应该是这样工作的正确工具。

1

检查您的用户是否有使用数据库的权限。 您可以通过安全 ->登录 ->选择用户并打开属性窗口来执行此操作。 然后从右侧菜单中选择"用户映射"。 现在检查您想要给定用户访问的数据库。 之后,从窗口的底部部分选择“数据库角色成员资格”,然后检查"db_owner"。 现在用户将是数据库的所有者,并能够执行查询、存储过程等。

更新:
通过选择您的数据库 -> 安全性 -> 用户 -> 右键单击"新用户"来为数据库添加用户。
或者您可以使用此查询

CREATE LOGIN AbolrousHazem 
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';
USE AdventureWorks2008R2;
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;
GO 

以下是更多细节 http://msdn.microsoft.com/zh-cn/library/ms173463.aspx


感谢您的回复。用户的db_owner角色已在数据库中设置。我尝试将特定的执行权限添加到db_owner角色中,但出现以下错误消息:“无法向特殊角色授予、拒绝或撤销权限。” - WestDiscGolf
检查一下你的数据库是否已经附加了用户。看起来你只有登录,但没有用户。 - Thea
这似乎是事实;我已经添加了一个答案来解决这个问题。感谢帮助 :-) - WestDiscGolf
1
太好了 - 将我的 SQL Server 登录设置为“db_owner”解决了我的问题。谢谢! - Mike Gledhill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接