【问题标题】:SQL Trigger to grant 'dbowner' permissions upon new DB creationSQL 触发器授予“数据库所有者”创建新数据库的权限
【发布时间】:2017-03-14 15:23:03
【问题描述】:

我将以下 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)

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

消息:此数据库中不存在用户或角色“[帐户名]”。 找不到数据库 ID 45,名称为“45”。数据库可能处于脱机状态。 请等待几分钟,然后重试。

我使用网络上的一些示例将其组合在一起。似乎触发器是在创建数据库时发生的,而不是在创建数据库后运行。有什么办法可以延缓吗?

【问题讨论】:

  • 您必须先通过CREATE USER [accountname] FOR LOGIN [accountname] 将用户添加到数据库中,此时您可以将用户添加到db_owner 角色,但我建议您使用ALTER ROLE [db_owner] ADD MEMBER [accountname] 而不是sp_addrolemember as sp_addrolemember 已被标记为已弃用。
  • 谢谢。在授予“dbowner”角色之前添加 CREATE USER 语句有效。我确实根据您的建议用 ALTER 语句替换了存储的过程,并且效果也很好。很高兴知道 sp_addrolemember 将很快被弃用。我仍然在我们的 SQL Server 2012 上看到它。
  • 最后我的回答有帮助吗?
  • @SomeDev,你能分享你的最终脚本吗?

标签: sql sql-server database-trigger


【解决方案1】:

这里有几件事要提到:

  1. 触发器在创建数据库后执行,因为这是默认行为
  2. 无法找到数据库可能表明缺少所需的权限。通过冒充被授予足够权限的用户(即某个数据库所有者)来确保您拥有足够的权限。使用WITH EXECUSE AS 子句。
  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?

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2011-06-28
    • 2013-03-16
    相关资源
    最近更新 更多