我有一个作业,其中调用了一个写好的存储过程,目的是在硬盘上删除掉太久的没有使用了的客户上传到硬盘上的一些文件,代码如下:
declare @weizhi nvarchar(100),@wenjianming nvarchar(50),@wenjianid int
declare @sql nvarchar(200)
select @weizhi=''
select @wenjianming=''
declare cursortemp cursor static for select weizhi,wenjianming,wenjianid from [dandushangchuan] where shanchu='是' and shanchuqueren='否'
open Cursortemp
fetch next from Cursortemp into @weizhi,@wenjianming,@wenjianid
while @@fetch_status=0
begin
  set @sql='del ' + @weizhi + @wenjianming
  exec master..xp_cmdshell @sql
  set @sql='rd ' + @weizhi
  exec master..xp_cmdshell @sql
  update [dandushangchuan] set shanchuqueren='是' where wenjianid=@wenjianid and shanchu='是' and shanchuqueren='否'
  fetch next from Cursortemp into @weizhi,@wenjianming,@wenjianid
end
close cursortemp
deallocate cursortemp
这段代码是以前网上问的,然后我自己根据实际情况修改了下,不知道写得对不对,现在有几个问题想咨询下:1 对于删除文件和目录的那2个语句来说,如果要删除的文件和目录之前已经被删除了,导致代码执行的时候文件或者目录已经不存在,那么这段代码会报错中止么?是否有必要先判断一下文件和目录是否存在?代码怎么写呢?2 关于权限问题,2个删除语句用到了xp_cmdshell这个存储过程,但是我执行这个作业和存储过程的用户的权限我给得比较小(只给了自己创建的这个数据库的public权限,其中只开了对自己创建的表和存储过程的select,update,insert,exec等权限),那么是不是就调用不了xp_cmdshell?而且网站目录那边除了管理员帐户外,我也只给了一个专门用于访问网站的用户对网站目录进行“读”的权限,那么现在我是不是对于这个作业应该换一个权限比较高的用户?比如SQL内置的BUILTIN\Administrators,如果这样做是否安全?3 之前网上看了一些安全设置的文章,我已经用sp_dropextendedproc xp_cmdshell 把 xp_cmdshell去掉了,那么在执行这个存储过程的时候是不是应该先恢复,用完了再去掉?语句应该怎么写呢?直接先sp_addextendedproc xp_cmdshell, xpsql70.dll 然后再sp_dropextendedproc xp_cmdshell?最后,这个作业的作用之前我已经说过了,但是我不知道是否还有更安全更效率的方法来达到我的这个目的?