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
感谢您的帮助和指点。希望这有助于未来的其他人。
检查您的用户是否具有您使用的数据库的权限。您可以通过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
感谢您的回复。数据库上设置用户的db_owner角色。我试图将特定的执行权限添加到db_owner角色,并收到以下错误消息:“无法授予,拒绝或撤销对特殊角色或从特殊角色的权限”。 – WestDiscGolf 2010-06-15 09:33:19
检查您是否有用户连接到您的数据库。看起来你只有登录而不是用户。 – Thea 2010-06-15 10:08:24
这似乎确实如此;我已经添加了解决问题的答案。感谢您的帮助:-) – 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'
感谢您的回复。我已经在服务器上运行了第一个命令,查询没有返回任何记录。 – WestDiscGolf 2010-06-15 09:55:02
感谢您在正确方向的帮助。 +1 :-) – WestDiscGolf 2010-06-15 10:46:22
错误表明用户“dbuser”在主数据库中不存在。
我假设用户存在于主数据库中?
您可以使用下面的T-SQL
USE MASTER;
GO
SELECT *
FROM sys.sysusers
WHERE name = 'dbuser'
如果用户原来不存在检查,只需使用CREATE USER语句,并创建一个名为“dbuser的”用户。用户将自动映射到同名的登录名(如果存在)。
感谢您的回复。不,它不存在于sysusers表中。如何重新添加? – WestDiscGolf 2010-06-15 10:14:21
好吧,重新添加用户并将其与dbuser登录关联。然后,我将授予权限应用于用户。 :-) – WestDiscGolf 2010-06-15 10:37:36
@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
,这应该是这样的工作的正确工具。
你是如何迁移你的数据库的?如果您还没有恢复主数据库,那么用户“dbuser”将不会存在,因此也不会映射。 – 2010-06-15 10:48:43
@John - 你是对的。 Master数据库的恢复还没有完成,这是因为我们希望在迁移过程中摆脱一些历史的坏点和波动。不幸的是,我们也失去了现在重新创建并映射到登录的用户:-) – WestDiscGolf 2010-06-15 11:04:42