服务器主体“DevMe”无法访问当前安全上下文下的数据库“CallManager”

时间:2012-06-29 07:07:54

标签: sql-server sql-server-2008

我正在尝试删除/删除用户权限,但我不断收到以下错误:

  

服务器主体“DevMe”无法访问数据库   当前安全上下文下的“CallManager”。

我的存储过程如下:

USE [AuditIT]
GO
/****** Object:  StoredProcedure [dbo].[AdminDevUserDelete]    Script Date: 06/29/2012 08:54:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--alter table AdminLog add HostName varchar(128) NULL DEFAULT HOST_NAME()

ALTER PROCEDURE [dbo].[AdminDevUserDelete]
    @SQLLoginName varchar(50) 
AS   

DECLARE @DatabaseName varchar(1000)

PRINT 'USE [master] DROP LOGIN [' + @SQLLoginName + ']'
EXEC ('USE [master] DROP LOGIN [' + @SQLLoginName + ']')

DECLARE CSDatabase CURSOR FOR 
    SELECT
        [Name]
    FROM
        [Master]..SysDatabases
    --WHERE
    --  --[sid] = 0x01
    --  [Name] NOT IN ('ReportSRV.Support','HelpDeskFacilities','QuestSoftware')
    ORDER BY
        dbid DESC
OPEN CSDatabase
FETCH NEXT FROM CSDatabase INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('SELECT [Name] FROM [' + @DatabaseName + ']..SysUsers WHERE [Name] = ''' + @SQLLoginName + '''')
    IF @@RowCount > 0
    BEGIN
        PRINT 'USE [' + @DatabaseName + '] DROP USER [' + @SQLLoginName +']'
        EXEC ('USE [' + @DatabaseName + '] DROP USER [' + @SQLLoginName +']')
    END
    FETCH NEXT FROM CSDatabase INTO @DatabaseName
END
CLOSE CSDatabase
DEALLOCATE CSDatabase

有人可以解释我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

  • 不要手动引用名称,使用内置的QUOTENAME功能。您的代码does not handle correctly包含嵌入的]字符的数据库和用户名。同样适用于'引号,再次使用QUOTENAME(它可以引用[',请参阅链接规范)。您的代码将破坏包含嵌入'
  • 的名称
  • 如果您使用SQL 2005以及DROP USER之类的动词,请使用适当的目录视图:sys.database_principalssys.databases
  • 始终在区分大小写的排序规则服务器上测试您的代码。您的代码将中断,因为您对目录名称使用混合大小写。 SQL服务器名称​​全部小写

最后,导致错误的问题是什么?在您没有发布的代码中,即您如何调用此存储过程。该错误表示您处于EXECUTE AS沙箱模式,请参阅Understanding Execution ContextUnderstanding Context Switching。您需要正确地code sign your procedure,以便它可以将上下文扩展到服务器级别(因为您正在触摸任意数据库,跨数据库代码签名是不够的。)

顺便说一句,如果您不在eXECUTE AS上下文中,那么很简单,只是您无法访问相关数据库,所以这是一个静音问题,因为您没有权利做你想做的事。其他要点仍然存在,并且考虑到正在尝试做的事情,正确等待获得此程序所需的权利仍然是使用代码签名...

更新

您的C#代码也易于SQL注入......这真的是一个火鸡射击。不要按procedure = dataBase + ".." + procedure建立您的程序名称!!