_EXECUTE AS OWNER
_句をプロシージャの一部として使用して、そのプロシージャの本体を別のユーザーとして実行できることは私の理解です。私の目標は、sysadmin
ロール(DBCC TRACEON(1224)
)を必要とするコマンドを実行することです。このプロシージャは、権限のないユーザーによって呼び出されることになっています。
sa
ユーザーの下で次のスクリプトを実行しました。
_SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo 1 1
IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo 1 0
DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.
RETURN
GO
EXEC MyProc
_
出力はコメントのインラインです。プロシージャの外では、sysadmin
メンバーシップを持っているように見えますが、プロシージャの内部ではないことがわかりました。
プロシージャはdbo
ユーザーが所有しています。データベースユーザーにsysadmin
ロールを付与することはできないことを理解しています(少なくともGUIはこの可能性を提供していません)。そのため、データベースユーザーにサーバーの役割を持たせる方法がわかりません。
_EXECUTE AS 'sa'
_も試してみたところ、結果は_Cannot execute as the user 'sa', because it does not exist or you do not have permission.
_になりました。 documentation は、ログイン名ではなく、ユーザー名のみを指定できることを示しています。それがうまくいかなかった理由を理解しています。
sysadmin
ロールメンバーシップでプロシージャを実行するにはどうすればよいですか?
それはできますが、一般的にはかなり危険だと考えられています。非常に基本的なレベルでは、データベースにtrustworthy
フラグを設定し、次に使用するときにexecute as
sp上では、サーバーレベルのプリンシパルセキュリティアクセスを利用できます。
これは非常に危険なので、ここでは詳しく説明しません。しかし、私はそれについてブログを書いています ここ それを行う方法についての具体的な指示があります。
言われていることはすべて、あなたが絶対にNEED
この方法でそれを行うことを非常に確実にします。あなたは大きなセキュリティホールを開いています。実行する場合は、SPを独自のデータベースに配置し、spへの接続と実行のアクセス権のみをユーザーに付与します。
私の目標は、sysadminロールを必要とするコマンドを実行することです(DBCC TRACEON(1224))
非特権ユーザーがsysadminロールとして実行できるようにすることで、セキュリティに穴を開けています。
ロック数に基づいてロックのエスカレーションを無効にする_1224
_トレースフラグを設定しようとしている場合は、_ALTER TABLE
_を使用してテーブルレベルで設定できます。
例えば以下では、パーティションテーブルのパーティションレベルへのロックエスカレーションを有効にします。テーブルが分割されていない場合、ロックのエスカレーションはTABLEレベルで設定されます。
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
-有効なオプションは、AUTO、TABLE、およびDISABLEです。
これで、権限のないユーザーにテーブルの変更権限を与えることができます。
HTH
SQL Serverエージェントジョブ(sysadminメンバーが所有)を作成するとうまくいきますが、これはあまりきれいな解決策ではないことがわかりました。
ユーザーはmsdb.dbo.sp_start_jobを使用してジョブを(非同期で)開始できます。ただし、エージェントジョブを同期的に実行するには、これが必要な場合、さらに数行のコードが必要です。また、明らかに、SQL Serverエージェントサービスを起動して実行する必要があります。