我正在尝试删除/删除用户权限,但我不断收到以下错误:
服务器主体“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
有人可以解释我如何解决这个问题吗?
答案 0 :(得分:1)
]
字符的数据库和用户名。同样适用于'
引号,再次使用QUOTENAME(它可以引用[
和'
,请参阅链接规范)。您的代码将破坏包含嵌入'
。DROP USER
之类的动词,请使用适当的目录视图:sys.database_principals
和sys.databases
。 最后,导致错误的问题是什么?在您没有发布的代码中,即您如何调用此存储过程。该错误表示您处于EXECUTE AS沙箱模式,请参阅Understanding Execution Context和Understanding Context Switching。您需要正确地code sign your procedure,以便它可以将上下文扩展到服务器级别(因为您正在触摸任意数据库,跨数据库代码签名是不够的。)
顺便说一句,如果您不在eXECUTE AS上下文中,那么很简单,只是您无法访问相关数据库,所以这是一个静音问题,因为您没有权利做你想做的事。其他要点仍然存在,并且考虑到正在尝试做的事情,正确等待获得此程序所需的权利仍然是使用代码签名...
更新
您的C#代码也易于SQL注入......这真的是一个火鸡射击。不要按procedure = dataBase + ".." + procedure
建立您的程序名称!!