【问题标题】:Can we delete the physical file from server when I delete the corresponding entry from database?当我从数据库中删除相应的条目时,我们可以从服务器中删除物理文件吗?
【发布时间】:2012-01-18 09:13:44
【问题描述】:

当我从数据库中删除相应的条目时,我们可以从服务器中删除物理文件吗?

即 C:\Test\Test.txt -> 从数据库中删除此记录时,我需要从提到的位置删除相应的 Test.txt 文件。 有什么办法吗,我用的是SQL 2008。

任何帮助都会非常感激..

谢谢

【问题讨论】:

  • 这应该在应用程序级别处理,而不是在数据库级别处理。是的,有办法做到这一点,但这不是一个好的做法。

标签: sql database sql-server-2008 file


【解决方案1】:

方法有:

  • 使用xp_cmdshell proc (exec master..xp_cmdshell 'del C:\Test\Test.txt')
  • 使用 .NET CLR unsafe proc(需要用任何 .NET 语言编写并部署到 sql server。说来话长)

两种方式都很丑

再一次 - 这是最糟糕的做法。服务器不应删除用户文件或任何文件,因为它们不是其数据库的组成部分。

【讨论】:

  • 任何指针..如何使用 xp_cmdshell 或 .NET CLR 不安全的过程来删除文件..
【解决方案2】:

您可以使用CREATE TRIGGER FOR DELETE 创建一个在删除行时运行的触发器。删除时运行的 SQL 语句可以遍历表deleted 以获取已删除的行。对于每一行,它可以exec xp_cmdshell。 xp_cmdshell 默认禁用,因此您必须先使用exec sp_configure 启用它。

【讨论】:

    【解决方案3】:

    我没有对此进行测试,但我认为它应该可以工作。

    尝试编写一个以文件名作为参数的存储过程并使用以下命令将其删除:

    exec master.dbo.xp_cmdshell 'del <Filename>'
    

    然后在包含文件名的表上创建一个删除触发器,该表调用存储过程并从表已删除中提供文件名,或者你可以直接运行命令 exec master.dbo.xp_cmdshell 'del' 来自触发器。

    更好的方法是将文件保存为数据库中的对象而不是文件路径,删除时只需删除文件对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2015-07-07
      相关资源
      最近更新 更多