SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server エージェントで Transact-SQL を実行する際に使用されるログインについて

without comments

「sysadmin」ロールのログインで SQL Server エージェントのジョブを設定していると、あまり意識しない点だったのでまとめておこうかと。

ドキュメントとしては Give Others Ownership of a Job となります。

SQL Server エージェントのジョブを操作できる権限

SQL Server エージェントの操作ですが、次の権限が必要となります。

ジョブを作成するには、 SQL Server エージェント固定データベース ロールか sysadmin 固定サーバー ロールのメンバーである必要があります。 ジョブの編集は、ジョブの所有者または sysadmin ロールのメンバーのみが行うことができます。 SQL Server エージェント固定データベース ロールの詳細については、「 SQL Server エージェントの固定データベース ロール」を参照してください。

SQL Server エージェントの操作については、「sysadmin  サーバーロール」に参加しているか、「msdb 内の固定データベースロール」で制御が行われます。
(ジョブの情報は msdb に格納されるため、ジョブ用のサーバーロールではなく、msdb の固定データベースロール

sysadmin は SQL Server のインスタンスに対しての管理権限を保有しているログインとなるため、様々な操作を行うことができ、その中には「SQL Server エージェントのジョブの操作」も含まれています。

msdb の固定データベースロール

「SQL Server エージェントの固定データベースロール」は msdb 内に存在しているデータベースロールとなり、次のドキュメントで解説が行われています。

具体的には次の 3 種類のデータベースロールを使用することができます。

  • SQLAgentUserRole
  • SQLAgentReaderRole
  • SQLAgentOperatorRole

sysadmin のサーバーロールのメンバーではなく、上記の msdb のデータベースロールのメンバーでもないログインについては、SSMS で接続を行っても「SQL Server エージェント」の項目は表示されません。

image

msdb の固定データベースロールに参加させると、SQL Server エージェントが表示され、操作ができるようになります。

imageimage

 

所有者と Transact-SQL の実行ユーザー

SQL Server Agent のジョブには「所有者」という設定があり、ジョブを作成したログインが所有者として設定されます。

image

sysadmin であれば全てのジョブの所有者を変更することができます。

ジョブの所有者を変更するには、システム管理者でなければなりません。

「sysadmin」 以外で、SQL Server エージェントの操作権限を持つログインは、自分が所有しているジョブについての設定を変更することができますが、所有していないジョブについては設定の変更をすることはできません。

「所有者の設定」はジョブの設定変更の定義以外にも大きな役割があり、SQL Server エージェントのジョブを実行した際の実行時ログインにも影響を与えます。

「sysadmin_login」というログインは、「sysadmin 固定サーバーログイン」のログインです。

それでは、このログインが所有者として設定されているジョブを実行してみます。

image

「SELECT @@VERSION」を実行するだけの単純なジョブなのですが、実行時の資格情報は「NT SERVIE\SQLSERVERAGENT」となっていますね。

このサービスアカウントは私が使用している環境の「SQL Server エージェントのサービスアカウント」となります。

image

SQL Server エージェントのサービスアカウントについては、sysadmin のサーバーロールのメンバーですので、この動作となっている場合は、SQL Server に対しての様々な作業を行うことができます。

image

所有者が「sysadmin」の固定サーバーロールになっている場合は、このような動作になるかと。

それでは sysadmin 以外のロールのログインが所有者に含まれている場合はどうでしょうか。
先ほどのジョブの所有者を「basic_login」というログインに変更しました。

image

このログインは、master に接続ができる程度の設定が行われている、権限の弱いログインです。

image

所有者が sysadmin ロールのログインでない場合は、所有者に設定されているログインの権限でジョブステップが実行されていることが確認できました。

ジョブがどのログインで実行されているかは、SQL Server エージェントのジョブの履歴で確認をすることもできます。
image

ジョブの実行については、SQL Server エージェントのサービスアカウントで基本的には実行され、sysadmin 以外のログインの場合は、

EXECUTE AS LOGIN = N'basic_login' WITH NO REVERT

というような形で、EXECUTE AS LOGIN により、ログインアカウントを変更して実行されているというのが基本的な仕組みかと。

 

ジョブステップ単位で実行時のユーザーを指定する

SQL Server エージェントのジョブステップで Transact-SQL を実行する場合、「実行するアカウント名」を指定することはできません。

(実行するアカウントは、オペレーティングシステムコマンドを実行する際等にプロキシアカウントを設定することが多いかと)

image

Transact-SQL で、実行時の資格情報を所有者以外に設定する場合は、「詳細設定」の「実行時のユーザー」から設定を行います。

このユーザーはジョブステップのデータベースのデータベースユーザーを指定することができますので、特定のユーザーでジョブステップを実行したい場合はこの設定を利用します。

image

実行時のユーザーについては「EXECUTE AS USER」によって資格情報を変更して実行が行われていたはずです。

SQL Server の権限は

  • サービスアカウント
  • ログイン (サーバー ログイン)
  • ユーザー (データベース ユーザー)

の 3 種類がかかわることが多いですので、どの資格情報が使用されているかを意識 / 調査できるようにしておくと権限周りを整理できるのではないでしょうか。

Written by Masayuki.Ozawa

4月 4th, 2020 at 6:46 pm

Posted in SQL Server

Tagged with

Leave a Reply