2

我正在尝试在 dbo.restorehistory 表上设置触发器,以尝试在数据库还原后验证用户角色。当恢复记录到历史表时,触发器只是查询“destination_database_name”。然后我尝试在有问题的数据库上运行“EXEC sp_addrolemember”。然而,显然,该过程不存在于数据库范围之外,即它在触发器内部不可用。

那么有人对如何管理此任务有建议吗?除了我的方法不起作用这一明显事实之外,完全可以有更好的方法。

简而言之,我需要能够添加一个用户并在恢复后将他设置为 db_owner。

这些恢复的问题在于它们是从我们无法控制的第 3 方应用程序远程执行的。当他们创建一个新数据库时,他们执行恢复以使用默认数据填充数据库,从而覆盖我们专门设置的用户角色,即使我们在模型数据库中指定了它们。所以...

  1. 第三方程序创建数据库
  2. 数据库从模型数据库继承用户
  3. 第三方程序通过恢复默认数据库覆盖用户
  4. 我需要重新创建这些用户并应用他们的角色
    设置 ANSI_NULLS ON
    去
    设置 QUOTED_IDENTIFIER ON
    去
    -- ===============================================
    创建触发器 [dbo].[AfterRestore]
       ON [msdb].[dbo].[restorehistory]
       插入后
    作为
    开始
       设置无计数;
       将@DatabaseName 声明为 VARCHAR(100)
         选择 @DatabaseName = 目标数据库名称
         从插入
         为登录 [域\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 回答