日期:2014-05-17  浏览次数:20521 次

Sql Server CLR函数 可以访问本地文件,却不能访问web共享文件.
今天自己写了个CLR函数,函数如下:
  [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
        public static SqlBoolean IsFileExists(SqlString source)
        {
            return (SqlBoolean)File.Exists(source.Value);
        }

部署到数据库后,不能识别网络共享的文件,但在远程桌面资源管理器中能打开,估计是和共享用户有关,有人知道原因吗?
例如:
--结果存在
select dbo.IsFileExists('d:\Tulips.jpg')

--结果为0,但在资源管理器中能打开图片
select dbo.IsFileExists('\\tas\WBLUE\Common\DevPortal_LocalizationPage.jpg')

另外再问下,我用用户名A登陆数据库,数据库中自定义函数再访问共享文件时,所使用用户是否是当前登陆者呢?
拜托高手了。
Web clr SQL?Server 数据库 网络

------解决方案--------------------
CLR函数没有写过,但是SSIS模块中中,如果要读取文件或者文件夹,是会有权限要求的,文件的读取权限是SQL的登录者。我猜测,你这里可能也是同样的情况。
------解决方案--------------------
确认你运行SQL Server服务的账号
拥有这个网络共享目录的权限
------解决方案--------------------
第二个问题
只要的你权限设置是当前上下文
就能够以账户A的身份访问
------解决方案--------------------
TSQL本身即能判断文件是否存在,不必用CLR吧.

exec master.dbo.xp_fileexist '[文件名]'

------解决方案--------------------
sql语句里对文件的访问权限,来自于你的sql server服务启动账户,
如果这个启动账户没有网络权限,那么肯定是访问不了文件的。