Amazon Web Services ブログ

RDS SQL Server での SQLAgentOperatorRole の活用

SQL Server DBA およびユーザーは、SQL Server インスタンスでジョブをスケジュールするために SQL Server エージェントを長い間使用してきました。これは、スケジュールに従って、アドホックベースで、またはイベントに応じてジョブを起動できる便利なツールです。SQL Server エージェントは常に Amazon Relational Database Service (Amazon RDS) でサポートされていますが、権限が制限されています。たとえば、RDS マスターユーザーでも SQL Server Management Studio (SSMS) ユーザーインターフェイスを使用して、インスタンスでスケジュールされたすべてのジョブを確認することはできません。最近の RDS の変更により、より多くの権限がマスターユーザーに付与されており、上記の制限はなくなりました。このブログでは、権限への変更と、新しい権限をシームレスに使用する方法について説明します。

新しい SQL Server エージェントの権限

RDS SQL Server は、Enterprise、Standard、および Web エディションで SQL Server エージェントをサポートしています。RDS SQL Server インスタンスのマスターユーザーは、デフォルトで SQLAgentUserRole に追加されます。マスターユーザーは他のユーザーを SQLAgentUserRole に追加することもでき、このロールの一部であるすべてのユーザーは SQL エージェントジョブを作成できます。ジョブを作成したユーザーだけが、そのジョブを表示、有効化、無効化、編集、実行、開始、および停止できます。これは一部のユースケースでは十分ですが、このレベルのアクセスでは不十分なユースケースもあります。たとえば、メンテナンスジョブが個々のユーザーアカウントを使用して作成されるデータベース管理者 (DBA) のチームでは、ジョブを作成した DBA が多忙なときは別の DBA がジョブを開始することがあります。この要件やその他の要件に対処するため、2019 年 2 月 25 日以降、RDS SQL Server は SQLAgentOperatorRole のためのサポートを追加しました。基礎となる SQL Server 実装のため、SQLAgentOperatorRole をRDS の SQLAgentUserRole と同じ方法で処理することはできません。読みやすくするために、以降 SQLAgentUserRole をユーザーロール、SQLAgentOperatorRole をオペレーターロールと呼びます。

オペレーターロール

オペレーターロールの一部であるユーザーは、他のユーザーが作成したジョブを有効化、無効化、表示、実行、開始、および停止できます。作成したジョブのみを編集できます。許可されるアクションの完全なリストについては、「Microsoft の資料」を参照してください。オペレーターロールには、ユーザーロールのすべての権限が含まれています。そのため、両方のロールの一部であるユーザーは、オペレーターロールに関連付けられたすべての権限を持ちます。RDS では、デフォルトでユーザーロールにマスターユーザーが追加されるのとは異なり、マスターユーザーはオペレーターロールに追加されません。RDS でそれが行われる理由については、ブログの後半でさらに説明します。ただし、自分自身または他のユーザーをロールに追加する権限がマスターユーザーに付与されています。

オペレーターロールへのアクセス

マスターユーザーは ALTER ROLE コマンドを使用して、自分自身または別のユーザーをオペレーターロールに追加できます。たとえば、ロールにユーザー dba1 を追加するには、以下の Transact-SQL (TSQL) コマンドを使用できます。これらのコマンドを実行する前に、dba1 ユーザーはすでに msdb データベースに作成されているはずです。

use msdb
go
alter role SqlAgentOperatorRole add member dba1
go

オペレーターロールにユーザーを追加するのではなく、マスターユーザーが他のユーザーに自分自身をオペレーターロールに追加する権限を与えたい場合は、そのロールに対する ALTER 権限を付与することによって行えます。たとえば、dba1 ユーザーに自分自身をオペレーターロールに追加する能力を与えるには、次のコマンドを使用できます。

use msdb
go
grant alter on role::[SQLAgentOperatorRole] to dba1
go

マスターユーザーが dba1 ユーザーに他のユーザーがオペレーターロールにメンバーを追加することを許可すると決定した場合は、GRANT OPTION を使って ALTER 権限を付与できます。そのためのコマンドは次のようになります。

use msdb
go
grant alter on role::[SQLAgentOperatorRole] to dba1 with grant option
go

オペレーターロールが異なる方法で処理される理由

オペレーターロールの一部であるユーザーは、SSMS を通して RDS SQL Server インスタンスにログインするとエラーメッセージを受け取るため、マスターユーザーは直接オペレーターロールに追加されず、自分または他のユーザーをオペレーターロールに追加するアクセス権が与えられます。エラーは次のように表示されます。

オペレーターロールの一部であるユーザーに対する SQL Server の内部ログイン実装には、いくつかの内部ストアドプロシージャへの呼び出しが含まれます。呼び出されるプロシージャの 1 つは、拡張ストアドプロシージャ – xp_regread です。この拡張ストアドプロシージャへのアクセスは RDS 内でブロックされるため、オペレーターロールの一部であるユーザーとしての RDS SQL Server インスタンスへの接続はログインエラーで失敗する可能性があります。行ったテストから、ログインエラーは SSMS でだけ見られます。Azure Data StudioSQL Developer、および Toad からのログインに問題はありません。

SSMS エラーメッセージで [OK] ボタンをクリックすると、SQL Server へのセッションが作成されますが、SSMS の [SQL Server エージェント] ドロップダウンメニューは表示されません。ただし、オペレーターロールの一部であるユーザーに対して機能すると予想されるすべての SQL Server エージェント TSQL コマンドは機能します。そのため、SQL Server エージェントをプログラムまたは TSQL コマンドで管理している場合は、SSMS エラーを無視しても問題ありません。SSMS のグラフィカルユーザーインターフェイスを使用することが重要な場合は、RDS でこれを実現する方法が 2 つあります。

オペレーターロールなしのログイン

最初の方法は、ログイン後にユーザーがオペレーターロールに自分自身を追加することです。ユーザーロールの一部であるユーザーは誰でも SQL Server エージェントメニューを表示することができ、ユーザーはログイン後にオペレーターロールに追加されているので、ユーザーは SQL Server エージェントメニューを表示することができ、エラーに遭遇しません。以下のスクリーンショットでは、ユーザーは SSMS を介して SQL Server にログインしており、ユーザーロールの一部です。そのため、ユーザーは SQL Server エージェントメニューを表示できますが、他のユーザーが作成したジョブは表示できません。

ユーザーはこれで、上記のコマンドを使用して自分自身をオペレーターロールに追加してから、次に示すようにジョブリストを更新できます。

これで、ユーザーは SQL Server インスタンス上のすべてのジョブを表示することができます。

SQL Server エージェントジョブの作業が完了したら、ユーザーは SQL Server からログアウトする前にロールから自分自身を削除できます。これは以下のコマンドを使用して実行できます。これにより、次回のログイン時に同じプロセスをたどることができ、エラーメッセージが表示されなくなります。

use msdb
go
alter role SqlAgentOperatorRole drop member dba1
go

オペレーターロールありのログイン

ログアウトする前にユーザーがオペレーターロールから自分自身を削除しないと、次回のログイン時に SSMS エラーが表示され、これにより RDS の SQL Server エージェントグラフィカルユーザーインターフェイスにアクセスする 2 つ目の方法が得られます。この場合、ユーザーはすでにオペレーターロールの一部であり、ログイン中に SSMS エラーが発生します。これが発生したら、ユーザーはエラーメッセージで [OK] を選択して SQL Server にログインすることができます。SQL エージェントメニューは表示されません。以下にユーザーインターフェイスがどのように表示されるかを示します。

この時点で SQL Server エージェントのグラフィカルユーザーインターフェイスにアクセスするには、ユーザーは上記のコマンドを使用してロールから自分自身を削除し、サーバーレベルでユーザーインターフェイスを更新します。その後、SQL Server エージェントのグラフィカルユーザーインターフェイスは表示されますが、他のユーザーが所有するジョブは表示されません。ユーザーインターフェイスは次のように表示されます。

次に行うことは、オペレーターロールに自分自身を追加してジョブリストを更新することです。これは、オペレーターロールなしでログインする場合に説明した方法です。これが行われた後、サーバー上のすべてのジョブを表示することができ、インターフェイスは次のように表示されます。

まとめ

要約すると、SQLAgentOperatorRole は RDS で完全にサポートされており、SQL Server エージェントへのコマンドベースのインターフェイスはシームレスに機能します。SSMS でグラフィカルユーザーインターフェイスを使用している一部のユーザーは、ログインエラーが発生する可能性があります。ただし、上で説明したように、これを回避する方法があり、それは SQL Server インスタンスの根本的なエラーを示すものではありません。共有管理者アカウントを使用したくないお客様は、オペレーターロールを利用してこれらのジョブを制御できることがわかったので、個々のアカウントの下に SQL Server エージェントジョブを作成できます。

このブログについて質問やご意見がある場合は、下のコメント欄に記入してください。

 


著者について

 

Prashant Bondada は、アマゾン ウェブ サービスのシニアデータベースエンジニアです。彼は RDS チームで勤務しており、商用データベースエンジン、SQL Server や Oracle に焦点を当てています。