SQL触发器授予' dbowner'新数据库创建时的权限

时间:2017-03-14 15:23:03

标签: sql sql-server database-trigger

我将以下SQL脚本放在一起,以便在创建新数据库时创建触发器,以便为特定帐户授予db_owner权限:

    CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
DECLARE @DatabaseName NVARCHAR(128), @SQL NVARCHAR(4000)

SELECT  @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(128)');
SET @SQL = '
    USE ' + @DatabaseName + ';
    EXEC sp_addrolemember N''db_owner'', N''[accountname]'';'

EXEC(@SQL)

但是,当我尝试创建一个新数据库来测试此触发器时,我收到以下错误:

  

消息:用户或角色' [accountname]'在此数据库中不存在。   找不到数据库ID 45,名称' 45'。数据库可能处于脱机状态。   等几分钟再试一次。

我使用网络上的一些例子将它们放在一起。似乎在创建DB时正在发生触发,而不是在创建DB之后运行。有没有办法推迟呢?

1 个答案:

答案 0 :(得分:0)

这里很少提及:

  1. 触发器在创建数据库后执行,因为这是默认行为
  2. 无法找到数据库可能表示缺少必需的权限。通过模拟已被授予足够权限的用户(即某些数据库所有者),确保您具有足够的权限。使用Logger子句。
  3. 确保您拥有" [accountname]"存在于新数据库或服务器级别(取决于您尝试添加的帐户类型)。您可以添加数据库用户,数据库角色,Windows登录或Windows组。
    参考文献:
    https://msdn.microsoft.com/en-us/library/ms189799.aspx
    https://msdn.microsoft.com/en-us/library/ms187750.aspx
    SQL Server 2008 - Does a trigger run with the same permissions as the login/user?