在触发器内部创建数据库不起作用

1 sql-server-2005

我尝试使用触发器概念。如果在用户表中插入任何新行,我的触发器将触发并尝试为该新用户创建动态数据库。但是在触发器内部创建数据库不起作用。怎么可能搞定。任何人都可以有任何建议。请对此提供帮助

dez*_*zso 10

正如文档所说(在Trigger Limitations 下):

DML 触发器中不允许使用以下 Transact-SQL 语句:
(...) CREATE DATABASE (...)

还有更多限制,强烈建议查阅文档。

这一切都意味着,据我所知,您应该在应用程序级别解决此问题*:检查您的用户是否已成功创建,然后发出CREATE DATABASE声明。最好将这两个包含在一个事务中,以便两者都成功或都失败 - 这样您就可以确保您的数据处于一致状态。DROP DATABASE如果交易失败,您可能必须发出 a 。(感谢 Jon Seigel 指出这一点。)

*:从这个角度来看,“应用程序”也可能是一个 T-SQL 代码块(或一个存储过程)。


Rem*_*anu 6

您不想在 DML 触发器中为新租户配置席位。一方面,配置通常很长,并且您不想阻止 DML,并且可能阻止其背后的新用户入职 HTTP 请求。您希望能够创建和加入用户,然后开始配置过程。如果配置出错,您可以稍后通过离线干预解决问题,并且您可以联系用户记录并通知帐户现在已正确配置(即您不会失去客户)。第二个原因是您遇到的问题,即某些配置操作根本无法从 DML 触发器执行,并且随着事情的发展和您的架构变得更加复杂,配置将变得更加复杂(例如,负载平衡帐户资源)。

通用的解决方案是将两者解耦并使用队列。帐户创建将消息放入队列以请求提供帐户。队列监视过程开始(在提交用户帐户之后!)并异步执行必要的工作。SQL Server 可以通过Service Broker内部激活来处理这个问题。这比在应用程序级别执行要好得多,因为它是可靠的(即,如果用户在创建帐户期间停止页面加载,进而触发取消处理 HTTP 请求的应用程序,它不会留下孤立的非提供的帐户)。