Sql server执行权限;未能应用权限

问题描述:

我刚刚从SQL2000迁移到SQL2008,并且我开始在使用sp_OACreate的存储过程中获取执行权限问题。Sql server执行权限;未能应用权限

系统的其余部分可以正常工作,并且已经建立并添加到数据库中。

我已经试过:

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

但这种失败,出现以下错误:

Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbuser', because it does not exist or you do not have permission.

我登录到服务器SA具有完全权限。我可以执行类似的sql语句并将权限应用于服务器角色,但不是登录名/用户。

如何将更改应用于特定用户/登录?

我可以将权限应用到公共角色,它可以解决我的问题;然而,这似乎是我的一个安全问题,我不想将它应用到实时服务器上。

从John的回答引出我检查了Master数据库上的用户列表,并且我的用户不在那里。它是否被删除或丢失了一些我不知道的东西。将dbs迁移到新的服务器实例可能会引发一些疯狂的事情。

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

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 

感谢您的帮助和指点。希望这有助于未来的其他人。

+0

你是如何迁移你的数据库的?如果您还没有恢复主数据库,那么用户“dbuser”将不会存在,因此也不会映射。 – 2010-06-15 10:48:43

+0

@John - 你是对的。 Master数据库的恢复还没有完成,这是因为我们希望在迁移过程中摆脱一些历史的坏点和波动。不幸的是,我们也失去了现在重新创建并映射到登录的用户:-) – WestDiscGolf 2010-06-15 11:04:42

检查您的用户是否具有您使用的数据库的权限。您可以通过Security -> Logins -> Select User执行此操作并打开属性窗口。然后从右侧菜单中选择"User Mapping"。现在检查您希望给定用户有权访问的数据库。之后,从窗口的底部选择“数据库角色成员资格”并检查"db_owner"。现在用户将成为数据库的所有者,并能够执行查询,存储过程等。

UPDATE:
选择你的数据库的数据库添加用户 - >安全 - >用户 - >右键单击"New User"
或者您可以使用此查询

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

这里有更多的细节http://msdn.microsoft.com/en-us/library/ms173463.aspx

+0

感谢您的回复。数据库上设置用户的db_owner角色。我试图将特定的执行权限添加到db_owner角色,并收到以下错误消息:“无法授予,拒绝或撤销对特殊角色或从特殊角色的权限”。 – WestDiscGolf 2010-06-15 09:33:19

+0

检查您是否有用户连接到您的数据库。看起来你只有登录而不是用户。 – Thea 2010-06-15 10:08:24

+0

这似乎确实如此;我已经添加了解决问题的答案。感谢您的帮助:-) – WestDiscGolf 2010-06-15 10:44:30

您的问题可能与孤儿用户有关。

尝试

USE MASTER 
GO 
EXEC sp_change_users_login 'Report' 

这将返回每个孤立的用户名一行。然后,

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser' 
+0

感谢您的回复。我已经在服务器上运行了第一个命令,查询没有返回任何记录。 – WestDiscGolf 2010-06-15 09:55:02

+0

感谢您在正确方向的帮助。 +1 :-) – WestDiscGolf 2010-06-15 10:46:22

错误表明用户“dbuser”在主数据库中不存在。

我假设用户存在于主数据库中?

您可以使用下面的T-SQL

USE MASTER; 
GO 

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

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

+0

感谢您的回复。不,它不存在于sysusers表中。如何重新添加? – WestDiscGolf 2010-06-15 10:14:21

+0

好吧,重新添加用户并将其与dbuser登录关联。然后,我将授予权限应用于用户。 :-) – WestDiscGolf 2010-06-15 10:37:36

+0

@WestDiscGolf:好消息,很高兴帮助。 – 2010-06-15 10:42:48

下面是一些代码,我使用的验证(当前用户)对等由sp_OACreate EXECUTE权限:

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%'; 

正如指出的@约翰桑塞姆和@WestDiscGolf的用户在存在主数据库和执行权限必须授予主数据库,因此需要use Master。如果用户具有执行权限,则上述查询将返回记录,如果用户没有执行权限,则返回记录。 (在用户数据库中的执行也将返回空集。)

我找不出一种方式检查这些权限使用fn_my_permissions,这应该是这样的工作的正确工具。