SQL Server FileTable:删除文件

Posted

技术标签:

【中文标题】SQL Server FileTable:删除文件【英文标题】:SQL Server FileTable : delete file 【发布时间】:2016-11-26 08:38:36 【问题描述】:

我使用filetable。当我从 SQL Server 的FileTable 中删除文件时,我希望将文件从文件夹中删除,当我从文件夹中删除文件时,它应该从 filetable 中删除。

我还有第二个问题:filetable 是在服务器中保存文件并读取它(大于 1MB 的文件)的更快方法吗?

【问题讨论】:

【参考方案1】:

对于第一个问题,应在删除相关行 (DELETE FROM ...) 并提交后立即删除文件。这同样适用于反向(如果您删除文件,则相关行应该消失)。

对于通过网络共享暴露的文件也是如此,物理文件将在稍后被删除,具体取决于恢复模型和文件流的垃圾收集过程(参见sp_filestream_force_garbage_collection存储过程)。

对于第二个问题,由于 SQL Server 开销,访问总是比纯文件系统慢(尽管 find 时间会快几个数量级)。

不过,与 T-SQL 访问相比,这完全取决于您存储的 blob 的大小。 简而言之,如果您的 blob 小于 1 MB,则使用 T-SQL 应该更快。更详细的数字请参考这里:Best Practices on FILESTREAM implementations。

【讨论】:

您是否有以下声明的官方参考:“同样适用于反向(如果您删除文件,则相关行应该消失)。”。我正在阅读here:“删除行和文件的唯一方法是使用 Transact-SQL DELETE 语句。”. 您好 TT,您发布的链接是关于 FileStream。问题是关于 FileTable。虽然一种使用另一种(FileTable 使用 FileStream),但它们是不同的技术。虽然您必须使用 T-SQL 删除文件流行,但您可以使用常规 Win32 命令删除文件表支持的文件。这就是,在 FileTable 中,过滤器驱动程序会自动为您发出删除语句(请参阅https://www.microsoftpressstore.com/articles/article.aspx?p=2225060&seqNum=2)。很抱歉造成混乱:)。 没有问题的朋友,我确实很困惑,不是你的错。感谢您的意见! 如何减少删除物理文件的时间?【参考方案2】:
DROP TABLE [ IF EXISTS ] [ database_name . [ schema_name ] . | schema_name . ]  
table_name [ ,...n ]  
[ ; ]  

您可以使用此代码删除文件表。如果您只想删除某些特定数据,请使用 where 或 Tsql 语句中的子句

【讨论】:

我的问题不是从文件表中删除一行的方法是什么。我的问题是如何同时从指定文件夹中删除行和物理文件【参考方案3】:

您必须记住的第一件事是 SQL Server 中的文件表是您可以使用它的最佳方式,因为这是管理器引擎,可帮助开发人员拥有管理文件的模式。 这个管理器使用物理位置保存文件并创建表来保存文件数据的基本信息。当您被删除文件时,文件表管理器有运行一段时间的作业并且它被删除物理文件。

如果你想立即删除物理文件,你可以使用这个子句:

 checkpoint;
 EXEC sp_filestream_force_garbage_collection @dbname = N'[DB Name]';    

你必须记住在使用 delay 从文件表中删除行之后使用这个子句 或在 SQL 触发器中使用(删除后):

Create TRIGGER [Schema].[TriggerName]
   ON  [Schema].[TableName]
   after  DELETE

AS 

  declare @T  table ([file_name]  varchar(50),num_col int, num_marked int , num_unproce int ,last_col bigint)
BEGIN

  checkpoint;
insert into @T EXEC sp_filestream_force_garbage_collection @dbname = N'[DB Name]'; 

END

【讨论】:

以上是关于SQL Server FileTable:删除文件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server FileTable 移动目录与内容 T-SQL

使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝

如何从 SQL Server 文件表中的二进制数据中获取文件类型?

另一个表中的 FileTable 和外键

如何使用Sqlserver 2012 Always on技术

sql server 2005怎么自动定时删除3天前的备份文件?