システムデータベースで管理タスクを実行するために必要な最小限の権限は何ですか?
質問
BarTender 2019以降で、BarTender System Databaseの管理タスクを実行するために必要な最小限の権限は何ですか?
回答
サーバーロール: dbcreator と データベースロール: db_owner が、BarTender System Databaseの管理コンソールで利用できるすべての管理タスクを実行するために必要な最小限の権限です。
管理コンソール内の各タスクに必要な権限の内訳は以下の通りです:
| アクション/手順 | 最小限の権限 |
| データベースサイズの表示 | データベース権限: データベース状態の表示 |
| データベースのバックアップ |
データベース権限: データベースのバックアップ バックアップを保存するディレクトリが存在している必要があり、 SQL Serverサービスがそのディレクトリへの読み書き権限を持っている必要があります。 |
| データベースのリストア |
サーバーロール: dbcreator データベースロール: db_owner |
| 今すぐメンテナンスを実行 |
データベース権限: 接続、削除、実行、挿入、選択、更新、 データベースのバックアップ(「削除されたレコードをアーカイブする」チェックボックスが有効な場合) |
| すべてのレコードを今すぐ削除 |
データベース権限: 接続、削除、実行、挿入、選択、更新、データベースのバックアップ(「削除されたレコードをアーカイブする」チェックボックスが有効な場合) データベースロール: db_ddladmin |
ただし、適切な権限を持っていても、現在既知の問題があり、メンテナンスの実行を行うユーザーがsysadminロールを持っていない場合、処理が失敗します。エラーメッセージは以下のような内容になります:
Stored Procedure: sp_updatestats Failed; Inner Message: User does not have permission to perform this action.
Processed 584 pages for database 'SystemDB', file 'SystemDB' on file 1.
Processed 1 pages for database 'SystemDB', file 'SystemDB_log' on file 1.
BACKUP DATABASE successfully processed 585 pages in 0.091 seconds (50.217 MB/sec).
これはSQL Serverの既知の問題です。メンテナンスで使用されるストアドプロシージャの1つ「SpDeleteRecords」が、SQL Serverの組み込みプロシージャ「sp_updatestats」を呼び出します。これは、レコード削除後のクエリパフォーマンス向上のためです。
残念ながら、Microsoftのドキュメントではデータベースオーナー(dbo)にこの実行権限があると記載されていますが、現時点ではSQL Serverのバグにより失敗します。
回避策としては、顧客側で「SpDeleteRecords」ストアドプロシージャを(SQL Server Management Studioを使って)以下のように変更してもらう方法があります:
SQL Server Management Studioの左ペインで「YourDatabase\Programmability\Stored Procedures」内のdbo.SpDeleteRecordsを右クリックし、「Script Stored Procedure as ALTER to > New Query Editor Window」を選択して、「SpDeleteRecords」のALTERスクリプトを生成します。
スクリプトのALTER行に「with execute as 'dbo'」を以下のように追加します:
ALTER PROC [dbo].[SpDeleteRecords](@pastUtcTicks bigint, @categories nvarchar(1024)) with execute as 'dbo'
このスクリプトをF5キーまたはツールバーの「! Execute」ボタンで実行します。
これにより、「SpDeleteRecords」がデータベースオーナーの権限で実行されるようになります。ストアドプロシージャを修正した後、(上記表の最小限の権限で)再度メンテナンスを実行してみてください。正常に動作するはずです。
詳細情報(社内用)
DEVQ-4363 および BUG-2270 を参照
また、今後、特定のサーバーロールやデータベース権限の付与がなぜ必要なのか、そしてそれが(db_ownerなど)セキュリティリスクになるのではという問い合わせが来る可能性があります。実際、今日もお客様からこの質問を受け、以下のように回答しました。
SQL Serverユーザーがどのデータベースロールを持っているかという観点ではなく、次のような観点で考えることをおすすめします:
- BarTender System Databaseで使用しているSQL Serverアカウントのパスワードは複雑で安全性が高いものになっていますか?
- そのパスワードを知っている/アクセスできるのは社内の誰ですか?
SQL Server管理者にとっては、db_owner権限自体がすでにセキュリティ上の懸念事項ですが、実際にはそのアカウントのパスワードを誰が知っているか、またパスワードの複雑さが重要だと考えます。