【问题标题】:SQL Server trigger to drop another databaseSQL Server 触发器删除另一个数据库
【发布时间】:2015-09-30 10:48:38
【问题描述】:

我正在寻找使用触发器删除数据库。这样做的原因是我有一个包含客户详细信息的表,当创建客户时,会为客户创建一个数据库,并且他们的所有数据都保存在他们的数据库中。因此,删除客户端会留下一个孤立的数据库。客户端 ID 字段 (guid) 是数据库名称。任何帮助将不胜感激。

到目前为止,这是我尝试过的:

CREATE TRIGGER DeletedClientDB
ON systemclients
FOR DELETE
AS
    DECLARE @db VARCHAR(50);

    SET @db = (SELECT deleted.SystemClientID FROM deleted)

    DROP DATABASE @db
GO

但语法不正确。

【问题讨论】:

  • 你已经尝试了什么?
  • 您使用的是哪个 DBMS?请使用适当的标签,也许你会有一个更快的答案。
  • 我不会在触发器内部这样做 - 触发器应该非常小、快速、灵活。不要在触发器内进行繁重的处理(比如删除整个数据库!)!相反:在触发器中,将 reminder 写入“要删除的数据库”表中,然后在 SQL Server 中有一个单独的作业,定期检查该表并删除其中提到的所有数据库.
  • 或将其发送到服务代理队列。

标签: sql triggers sql-server-2012


【解决方案1】:

更新

阅读 Martin Smith 的 cmets 后,我决定最好完全改变我的答案。我保留了之前的答案,以便 cmets 不会丢失上下文。

结合marc_s 和我自己的评论,我建议只需将已删除的 id 插入到不同的表中,并安排一个计划的作业从那里读取数据并删除数据库。

试试这个:

CREATE TRIGGER DeletedClientDB

ON systemclients

FOR DELETE
AS

DECLARE @dropdb VARCHAR(150);

Select @dropdb = 'drop database ' + deleted.SystemClientID FROM deleted)


Exec(@dropdb)

GO

请注意,您需要删除客户表中记录的用户的删除数据库权限。

【讨论】:

  • 删除会影响多行。
  • 出现错误:“DROP DATABASE 语句不能在用户事务中使用”
  • 首先,马丁当然是正确的。其次,如果您的触发器位于事务内部(如错误消息所示),那么您根本无法使用触发器来删除数据库。还有其他可以做的事情,比如将删除的客户端 ID 插入到不同的表中,并安排一个计划的作业删除数据库并清理表。这只是我想到的第一件事,可能有更好的方法来处理这个问题。
  • 触发器总是在事务中,所以这种方法永远行不通。
  • 实际上它可以通过首先在触发器中提交父事务来工作,但这不是一个正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
相关资源
最近更新 更多