web-dev-qa-db-ja.com

SQL Server-SQLエージェント-グループにジョブの所有を許可する

シナリオ

私たちの組織には、開発、サポート、実装の3つのユーザーグループがあります。現状では、誰もがすべてに対して単一のログインを使用しています。私たちはこれから離れ始めています。誰もが各自が自分のグループシステムにアクセスできる自分のログインを介してデータベースにアクセスしています。したがって、サポートはサポート機能やジョブなどにアクセスできます。

プロシージャとテーブルに許可されている権限は本当に簡単です。 Windowsグループからログインを作成します。次に、そのログインに基づいてユーザーを作成し、ユーザーが作成する新しいスキーマで読み取りおよび実行できるようにします。

SQL Server 2012および2008 R2を実行しています。

問題

SQLエージェントジョブはユーザーレベルの上にあり、ログインを所有者に割り当てる必要があります。しかし、それは受け入れられたパラメータとしてグループログインを取りません:

指定された@owner_login_nameは無効です(有効な値はsp_helplogins [Windows NTグループを除く])。

希望するのは、グループが直接操作できる独自のジョブのセットを持つことです(ライブデータベースではなくレポートサーバー上で)。他の部門の作業または他のジョブに影響を与えることなく(DBメンテナンスタスク、レプリケーションなど)。ただし、元の作家が不在または退職した場合に、チームの他のメンバーがジョブを操作できるようにします。

私は周りを検索してみましたが、これまでのところ、2010年に sqlservercentral.com で見つけられた唯一のことは、実行できないと言っていました。

私が見ているもの

SQLエージェントジョブを、誰もアクセスできないsupport/devopment汎用アカウントに割り当てます。しかし、誰もがどういうわけか自分の仕事を操作するアクセス権を持っています。

これにより、人々はグループの仕事を変更することができ、個人が退職した後も仕事を使い続けることができます。

他の所有者がいるユーザーがジョブにアクセス/ジョブを実行できる方法が見つかりません(SQLへの同じWindowsグループログインを使用している場合でも)。それらを許可しないと、SQLAgentOperateorRole(それらをロックアウトするポイントを無効にする)互いの (および管理者の)ジョブ。

ジョブを操作するためにログインできる標準のサポート機能とともに、msdb権限への追加のアクセス権を持つグループごとにユーザーを作成します。

これの欠点は、ユーザーが2つのログインを持っていることです。1つは変更されません。そのため、会社を辞めたユーザーは、そのアカウントのログイン資格情報を引き続き持っている可能性があります。また、ユーザーが怠惰になり、そのアカウントでのみログインすることになります。 (彼らはすべきではありませんが、正直に言ってください)。

5分ごとに実行されるSQLジョブがある場合、各グループには、このコマンドを頻度xで実行するためのコマンドを含むテーブルがあります(基本的に、1つのSQLエージェントジョブが、カスタムのSQLエージェントジョブリストを実行します)

私はこれがどれほどひどい考えであるかを経験する必要はないと思います。しかし、それは半検討されているものです。

概観

明らかに、私たちが見ることができる最良の解決策は、グループがSQLエージェントジョブを所有できるようにすることですが、これは可能ではないようです。

誰かアイデアはありますか?今のところ、このようなものを実装する方法についてのガイダンスをいただければ幸いです。

4
Ste Bov

SQL Serverエージェントは、WindowsグループをSQL Serverエージェントジョブの所有者として使用することをサポートしていないためです。あなたはそれを行うことができますが、それは組み込みの制限を回避することを意味します。

以下のリンクに掲載されているコードを使用できます。

sysadmin以外、SQL Serverエージェントジョブの非所有者に実行を許可

このアプローチは、SQLエージェントジョブの「所有者」を中心とした「エンドラン」を実行のすべての実用的な目的で実行します。これは、dbo.StartAgentJobストアドプロシージャがdbo.msdbJobMapテーブルのログインとグループを使用して、SQLエージェントジョブを実行できるユーザーを決定するためです。書かれているように、ジョブに割り当てられたグループのメンバーが含まれ、ジョブを開始する権限があります。

つまり、SQL Serverエージェントジョブ(SQLAgentReaderRole以上のメンバー)を作成する権限を持つanyoneは、独自のジョブを作成および変更できます。

適切なGroupNameとJobNameをdbo.msdbJobMapテーブルに挿入する権限も持っている場合、ジョブに割り当てられたグループ内の誰でもジョブを実行できます。

GROUPはジョブを直接所有していませんが、dbo.StartAgentJobstoredプロシージャはその昇格されたアクセス許可を使用して、ログインやグループのメンバーがこのジョブを実行できるようにするかどうかを決定します。

まだ問題が残っていますか?

SQLエージェントジョブの所有者は、ジョブの内容を編集できる一人のみです。 (もちろん、sysadminはほとんど何でもできます。)

SQLエージェントジョブを書き換える必要がある場合and所有者がシステムに存在しないsysadminは、ジョブの所有者を無効なアカウントから新しい指定された所有者に変更できます。 (または、ジョブをスクリプト化して、書き換えを行う開発者にスクリプトを渡し、新しいジョブに新しい名前を付けます。)

したがって、開発者を管理者から完全に独立させることは100%の解決策ではありませんが、必要な対話を大幅に削減する必要があります

脚注:ジョブが分散サーバーで実行される場合、これでは不十分です。

1
RLF