【发布时间】: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_addrolememberas sp_addrolemember 已被标记为已弃用。 -
谢谢。在授予“dbowner”角色之前添加 CREATE USER 语句有效。我确实根据您的建议用 ALTER 语句替换了存储的过程,并且效果也很好。很高兴知道 sp_addrolemember 将很快被弃用。我仍然在我们的 SQL Server 2012 上看到它。
-
最后我的回答有帮助吗?
-
@SomeDev,你能分享你的最终脚本吗?
标签: sql sql-server database-trigger