2011-12-03 13 views
2

私はそのユーザーの呼び出しプロシージャが必要です。ユーザーがsysadminサーバー役割を持っていない場合、それはエラーより高い権限を持つSQL Serverの手順

は元本 「copy_user」は存在しないため、元本のこのタイプは が偽装、またはあなたが行うことはできませんサーバープリンシパルとして実行できません発生するという問題、許可を得ていない。

私はユーザーのsysadminサーバーの役割をすべて与えてもらえますか?

declare @ret int 
exec @ret = testProc @id = 0 
select @ret 

と手順それが/他のデータベースにデータをコピーするので、システム管理者とユーザーログインを持つことは非常にOKでないだろうべきで

ALTER PROCEDURE testProc 
    @id int 
AS 
BEGIN 
    declare @c int 

    exec as login = 'copy_user' 
    select @c = COUNT(*) from Customers 
    REVERT 

    return @c; 
END 
GO 

非常に簡単です。

私はまたしてcopy_userを偽装:私は(同じサーバー上の)他のデータベースにデータを挿入するが、現在のユーザーがアクセスすることを許可することはできません手順を必要とする

一般に
GRANT IMPERSONATE ON LOGIN::copy_user TO copy_user WITH GRANT OPTION 
GRANT ALTER ANY LOGIN TO copy_user 

GRANT IMPERSONATE ON USER::copy_user TO copy_user WITH GRANT OPTION 
GRANT ALTER ANY USER TO copy_user 
GRANT SELECT, INSERT, UPDATE, DELETE TO copy_user WITH GRANT OPTION 

GRANT IMPERSONATE ON USER::cp TO copy_user 

答えて

0

私はあなたが達成しようとしていることを私は確信していません。

ストアドプロシージャを介してデータにしかアクセスできず、直接アクセスできないデータベースユーザーが必要な場合は、関連ユーザーにストアドプロシージャの実行権限を与えます。ユーザーはデータベースデータに直接アクセスすることはできません。

+0

ユーザーは、テーブルからデータにアクセスしたり、プロシージャを実行したりすることができます。必要なのは、いくつかのプロシージャのスイッチ実行コンテキストを異なるデータベースにアクセスしてそこに書き込むことができるようにすることです。現在のコンテキストは、sysadminサーバーの役割を持つユーザーに対してのみ切り替えることができ、すべてのユーザーに対して実際には行いたくありません。 – Dainius

+0

なぜ実行コンテキストを切り替える必要がありますか?問題のデータベースユーザーが両方のデータベースに存在しないのですか? Cross Database Ownership Chainingを有効にしましたか? –

+0

私は1つのデータベースにのみユーザーを持ちたいが、彼に2番目のデータベースに接続することを許可しない。その理由は、両方のユーザーが使用する共通のデータを1つのデータベースに持つ2つの企業が存在し、1つのテーブルデータから各企業ごとに別々のデータベースに移動する必要があるという理由があります。ですから、データを書き込むためにすべてのデータベースにユーザーを作成すると、他の会社のデータベースに接続できます(変更する可能性があります)。これを避けたいと思います。 – Dainius

関連する問題