我被要求维护在ASP classic中创建的使用SQL Server数据库的站点。
我以备份的形式获得了数据库。我在本地计算机上恢复了数据库并为其创建了DSN connection
。但是,当我尝试加载我的网站时,该网站依赖的stored procedures
会出现执行权限被拒绝的错误。
有问题的存储过程有一个名为UserSecure
的用户显示为唯一具有EXECUTE
权限的人,我尝试按该名称创建用户但是这不起作用,即使我可以手动使用UserSecure
尝试使用这些凭据从网页连接登录到SQL Server Management Studio会产生login failed error
。
如果我运行sp_helplogins
我的Windows凭据显示为数据库的所有者,我实际上可以在SSMS内执行,但不能从ADO连接执行。
另一方面,webpage
中的连接编码如下,我不熟悉连接的应用程序部分。也许这是问题的一部分?我尝试连接DSN
和DSN-less
连接并且可以连接但不对数据库执行任何操作?
答案 0 :(得分:3)
您应确保将数据库服务器登录映射到相应的数据库用户(此问题在处理数据库备份时经常出现)。如果不是,那么您需要修复映射。幸运的是,有一个名为sp_change_users_login
的命令可用于解决此问题。
首先,检查您的登录是否已映射到数据库用户。使用SQL Server Management Studio(假设SQL Server 2008),在UserSecure
的安全/登录下查看。如果您在列表中看到它,请双击它并选择User Mapping
。从那里,找到您尝试连接的数据库,并查看UserSecure
是否映射到该数据库。如果不是,您可以使用以下命令进行修复(假设UserSecure
是登录和用户的名称):
EXEC sp_change_users_login AUTO_FIX, UserSecure
有关sp_change_users_login
的更多信息,请参阅MSDN:
http://msdn.microsoft.com/en-us/library/ms174378.aspx
答案 1 :(得分:0)
一个让我咬了几次的问题:
如果您的存储过程(或视图)需要用户的许可(假设userA
),并且存储过程调用另一个数据库的表或视图(比如viewB
),那么它是不够的只需登录viewB
的数据库,您还必须明确授予userA
权限以选择/执行/ etc。在viewB
上(这又需要viewB
数据库上的用户)
因此,在您的情况下,您可能需要对已还原的数据库引用的现有数据库上的存储过程显式授予UserSecure
执行权限。
答案 2 :(得分:0)
这可能不是最优雅的解决方案,但我放弃了关注一个过程,而是在整个数据库上为guest用户授予了执行权限。由于这只是在我的个人计算机上运行,因此安全性不是问题,似乎已经解决了问题。
答案 3 :(得分:0)
完全了解问题,
用户(名称)的ID将与备份数据库的ID不同。 MSSQL存储用户的ID而不是用户名(文本),因此每台计算机和备份的ID将不同(99%的时间)。因此,当ID不匹配时,您无法访问。
您需要做的就是删除用户并重新创建它,确保您在两个地方都这样做:
首先从数据库中删除用户:
数据库 - >安全 - >用户 - >右键单击(用户名)+删除
然后转到
安全 - > LOGINS - >右键单击(用户名)+删除
然后重新创建用户并为帐户提供正确的权限,这样你就可以了。