2

データベースの復元後にユーザーの役割を確認するために、dbo.restorehistoryテーブルにトリガーを設定しようとしています。リストアが履歴テーブルにログを記録するときに、トリガーは単に「destination_database_name」を照会します。次に、問題のデータベースで「EXECsp_addrolemember」を実行しようとします。ただし、明らかに、このプロシージャはデータベースのスコープ外には存在しません。つまり、トリガー内では使用できません。

それで、誰かがこのタスクを管理する方法について提案がありますか?私の方法が機能しないという明らかな事実は別として、完全にもっと良い方法があるかもしれません。

簡単に言うと、復元後にユーザーを追加してdb_ownerに設定できるようにする必要があります。

これらの復元の問題は、制御できないサードパーティのアプリケーションからリモートで実行されることです。新しいデータベースを作成すると、復元を実行してデータベースにデフォルトデータを入力し、モデルデータベースで指定されている場合でも、特別に設定したユーザーロールを上書きします。それで...

  1. サードパーティのプログラムがデータベースを作成します
  2. データベースはモデルデータベースからユーザーを継承します
  3. サードパーティのプログラムは、デフォルトのデータベースを復元することでユーザーを上書きします
  4. それらのユーザーを再作成して、役割を適用する必要があります
    ANSI_NULLSをオンに設定
    行く
    QUOTED_IDENTIFIERをオンに設定
    行く
    -=============================================
    CREATETRIGGER[dbo]。[AfterRestore]
       オン[msdb]。[dbo]。[restorehistory]
       挿入後
    なので
    始める
       NOCOUNTをオンに設定します。
       DECLARE @DatabaseName AS VARCHAR(100)
         SELECT @DatabaseName = destination_database_name
         挿入から
         ログイン[ドメイン\xyzzyusers]のユーザー[XYZZYユーザー]を作成します
         EXEC sp_addrolemember'db_owner'、'XYZZYユーザー'
    終わり
    行く

4

1 に答える 1

1

トリガー内からデータベース コンテキストを変更するには、動的 SQL を使用する必要があります。簡単な例を以下に示します

declare @DatabaseName nvarchar(100) = 'YourDB';

declare @cmd nvarchar(max);
set @cmd = replace('

    select db_name();

    use $dbname$;

    select db_name();
', '$dbname$', @DatabaseName);

print @cmd
exec sp_executesql @cmd;
于 2012-05-07T18:10:14.253 に答える