SQL Serverエージェントは、データベースインスタンスへのログインにどのSQL Serverログインを使用しますか?
SQLサーバーエージェントを組み込みのローカルシステムアカウントとして実行しています。
1つのステップを持つSQLエージェントジョブを作成しました。このステップでは、SYSTEM_USER
の値をテーブルに挿入します。
ジョブを実行し、ジョブが完了したときにテーブルから選択すると、SYSTEM_USER
の値がDOMAIN\SERVERNAME$
であることがわかります。そのため、エージェントがインスタンスにログインしているようです。
では、SQLログインではないときに、エージェントがDOMAIN\SERVERNAME$
としてログインできるのはなぜですか?
このアカウントにはどのような特権がありますか?
SERVERNAME$
は、Active Directoryのサーバーに割り当てられたマシンアカウントです。そのアカウントはNT AUTHORITY\System
としてローカルにマッピングされます。 SQL Serverのセキュリティには、通常NT AUTHORITY\System
という名前のアカウントがリストされています。これは、SQL Serverエージェントがローカルシステムとして実行するように構成されている場合にアクセスする方法です。
Microsoft Docs には、SQL Serverエージェントのサービスアカウントを構成する方法を選択するのに役立つ一連の詳細があります。それは次のように述べています:
ローカルシステムアカウント。このアカウントの名前はNT AUTHORITY\Systemです。これは、すべてのローカルシステムリソースに無制限にアクセスできる強力なアカウントです。ローカルコンピューターのWindows Administratorsグループのメンバーであるため、SQL Server sysadmin固定サーバーロールのメンバーである
SQLエージェントは、Windowsサービスのログインとして割り当てられているものを使用します。
Windowsサービスにアクセスして表示するには、スタートメニューをクリックして「サービス」と入力します。
SQLエージェントを見つけて、プロパティを表示します。
アカウントがローカルシステムの場合、実際にはマシンの資格情報を使用しています。 DOMAIN\SERVERNAME$
が返されました。
(これは、それがホストされているマシンのアカウントです。すべてのPCにはローカルシステムアカウントがあり、SQLのインストール時に追加されます。システムアカウントはsysadmin特権を継承しているため、そのままにしたくないと思います。デフォルト。 NT AUTHORITY\SYSTEM
SSMSのログインにどのように追加されるかと思います。)
別のアクセス許可を割り当てる必要がある場合は、別のログイン(通常はサービスアカウントまたはマスターサービスアカウント)を使用できます。
または、権限を持つアカウントに割り当てられたSQLサーバーに資格情報を作成します。次に、SQLエージェントでプロキシを作成し、それを使用してジョブを実行できます。
MSのベストプラクティスによると、SQL構成マネージャーを使用して、サービスアカウントのログイン資格情報を常に割り当てることです。他の方法で問題が発生したことは一度もありませんが、MSがそう言っていれば、それはおそらく正しいでしょう。
上記の優れた回答に加えて、ジョブがTSQLタイプの場合、[詳細設定]-> [ユーザーとして実行]フィールドで特定のデータベースユーザーとして実行するように明示的に選択されていない限り、ジョブはジョブの所有者として実行されます。