0

ユーザー権限を削除/削除しようとしていますが、次のエラーが発生し続けます:

サーバープリンシパル「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

誰かがこの問題を解決する方法を説明してもらえますか?

4

1 に答える 1

1
  • 名前を手動で引用しないでください。組み込みのQUOTENAME関数を使用してください。コードは、埋め込み文字を含むデータベース名とユーザー名を正しく処理しません。]引用符についても同じことが言えます。QUOTENAMEをもう一度使用してください(との両方を'引用できます。リンクされた仕様を参照してください)。コードは、embededを含む名前で壊れます。[''
  • SQL 2005以降の動詞をDROP USER使用する場合は、適切なカタログビューを使用してsys.database_principalsくださいsys.databases
  • 常に大文字と小文字を区別する照合サーバーでコードをテストしてください。カタログ名に大文字と小文字が混在しているため、コードが壊れます。SQLサーバー名はすべて小文字です。

最後に、表示されるエラーの原因となる問題は何ですか?投稿しなかったコード、つまりこのストアドプロシージャの呼び出し方法に含まれています。このエラーは、EXECUTEASサンドボックスモードになっていることを示しています。 「実行コンテキストについて」および「コンテキスト切り替えについて」を参照してください。コンテキストをサーバーレベルに拡張できるように、プロシージャを適切にコード署名する必要があります(任意のデータベースにアクセスしているため、データベース間のコード署名では不十分です)。

ところで、eXECUTE ASコンテキストを使用していない場合は、わかりやすく、問題のデータベースにアクセスできないため、実行しようとしていることを実行する権限がないため、ミュートの質問になります。他のポイントはまだ残っており、この手順に必要なものを正しく取得するための適切な待機は、何をしようとしているのかを考えると、コード署名を使用することです...

アップデート:

あなたのC#コードもSQLインジェクションを起こしやすいです...これは本当に七面鳥のシュートです。プロシージャ名を作成しないでくださいprocedure = dataBase + ".." + procedure!!

于 2012-06-29T07:39:47.577 に答える