2010-07-30 51 views
1

从SQL服务器中删除某个数据库(因为它们包含的关联数据已过时),我需要删除一些文本文件。我有一个想法,我可以使用某种触发器来运行查询来做到这一点,但我无法弄清楚该怎么做或如何去做。当我的数据库从SQL Server中删除时运行一些代码?

我正在使用SQL Server 2005,但随着时间的推移可能会升级。

任何想法?

感谢,

杰米

感谢马丁·史密斯,这里是我使用的代码:

CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR DROP_DATABASE 
AS 
DECLARE @database_count int 
select @database_count=count(*) from sys.databases where name='myDbName' 

IF @database_count = 0 
BEGIN 
    -- Our database has been dropped, delete text files 
    DECLARE @Result int 
    DECLARE @FSO_Token int 
    EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT 
    EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, 'D:\afile.txt' 
    EXEC @Result = sp_OADestroy @FSO_Token 
END 

我也只好跑这使OLE自动化删除:

exec sp_configure 
go 
exec sp_configure 'Ole Automation Procedures', 1 
-- Configuration option 'Ole Automation Procedures' changed from 0 to 1. 
go 
reconfigure 
go 
+0

刚刚看到您的更新。你可能会更好地使用CLR来避免任何可能的问题,因为你的ole对象不会被销毁 - 或者至少是在试图捕获摧毁进来的东西的时候。我不确定如果你得到的东西会发生什么目前在deletefile行上有一个错误。有一个示例CLR函数,在这里执行类似的操作http://www.mssqltips.com/tip.asp?tip=1374 – 2010-07-30 10:03:24

+0

e-我也更新了我的答案,举例说明如何让它只在您的目标数据库被删除。 – 2010-07-30 10:14:35

+0

谢谢你,优秀的信息:) – 2010-07-30 10:17:51

回答

3

您需要一个服务器作用域DDL trigger为此我认为。我并不确定如何删除TSQL中的文本文件。看起来像这里有some ideas。或者,也许你可以从清理的触发器中调用SSIS包。

CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR DROP_DATABASE 
AS 

IF EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 
                'nvarchar(max)') = 'myDbName' 
BEGIN 
/*Some code here*/  
END 
-3

是的。忘记这个想法,找到一个支持。

在:没办法。我放弃你的数据库(作为管理员),你已经死了数据库。点。

在exe文件被删除时,也没有办法在exe中执行一个触发器。

+3

你确定你知道你在说什么 - 曾听说过DDL触发器(看看@Martin smiths答案)? – pastacool 2010-07-30 08:40:11

相关问题