在数据库做一个服务来实现,只有这个方案了。
其它的方案呢,也不是完全没有:
1、如果是在局域网里,有服务器的权限(是AD就最好了)
2、如果不是局域网,是否支持\\host方式访问呢?
3、如果不是局域网,可以创造条件建立局域网,比如VPN
以上方案都可行,但是成本太高,还不如在服务器写一个service呢。
你说的这几个,可行是可行,可是还要开放另我下台机器的权限和访问方式之类的,sqlserver内部怎样实现的这个打开别的机器的文件夹的方法,没人知道是怎样调用的吗,我们可以想办法调用到这个方法吗?如果不能实现,只好使用别的方法了,同样,感谢您的回答。
@浪潮: SQL SERVER也只能打开服务器所在机器的文件夹吧?这个其实就是一个服务实现的,SQL服务本身的功能而已。
@519740105: 是的,其实我是想找到smo相关的操作里面,是不是有这个功能,能打开连接的机器的路径。
@浪潮: 这个倒是一个方案,应该在SQLSERVER的允许权限内可行。
@519740105: 嗯,刚和楼上那位大叔也讨论了,smo不知道有没有这样的功能,就是sqlserver在知道对方服务器IP,数据库账号和密码的情况下,如何能选择到路径的问题,因为Sqlserver有这样的权限,我们是不是可以通过对sqlserver sdk的操作,来完成这一功能呢?
做一个服务器端,做一个客户端。两者之间用SOCKET之类通信(SQL Management与SQL SERVER的关系)。
你在管理端看到的不过是服务端看到,然后传过来告诉管理端而已,原理就这么简单。
当然,实际用起来,SOCKET编程最麻烦的就是调试了。
其实,你应该有看过WEB类似的界面,或者说有些木马实现了类似功能。
在这里面IE/CHROME是客户端,而IIS+网站代码构成了服务端。
感谢您的回答,你说的思路应该可以实现,只是还是要在别的服务器上通讯,我主要是想利用Sqlserver的某些特性,或是C#有没有现成的方法, 能打开远程文件夹,就像Sqlserver里面可以选到别的机器的文件夹的功能一样。sqlserver又是怎样实现的呢?
@浪潮: 看来你完全没有看懂我说的。
SQL SERVER就是一个Window Service, SQL Management Studio就是一个传话器而已。
如果要用C#备份数据库,当然是备份在客户机了。
服务器备份根本不需要你写代码,吃多了再发明一个轮子,SQL SERVER可以设置自动备份的。
@爱编程的大叔: 大概就是这么个意思,具体如何实现呢?现在在寻找这个轮子。自动备份现在不需要,我现在需要的手工决定选择 客户机的路径和时机。
@浪潮:
完全没有明白你的意思。
1、如果是我做一个工具,大概是这样的,
客户可以输入服务名、UID、PWD、DATABASE,
选择本地路径,按下备份按钮,
软件就开始读数据库,并在本地保存。这个不需要服务器端支持,当然SQL SERVER是免不了的。
2、如果要备份在服务器上,实际上意味着这个服务器就是你完全控制了,但做一个这样的工具,无非是
你可以随时备份,个人感觉用处不大,另外,会给服务器靠成很大的安全隐患。
一般真要做成客户端备份在服务器上的话,只需要提供文件名,甚至有时候连文件名都不需要提供,
服务器设置好了备份路径,这样做法会好点。
3、因为完全不知道你的原始需求为什么会造成你想实现这样的功能,所以也只能就事论事。
但希望你从逻辑学角度看待此事。原则上,除非服务器同意,没有任何一台客户机可以获取服务器的文件夹结构的。这里面的同意,实际上就是说服务器上安装有你的木马(Window Service)
@爱编程的大叔: 同意你的看法,这需求确实有点怪异,奇实就是模拟sqlserver的手工备份还原的功能,你说的第二点,既然sqlserver本身可以读到服务器的路径,我是想代码里是不是也可以做到,对于sqlserver而言,他只是知道这台服务器IP,SqlServer的账号和密码。但是在Sqlserver里就可以做到选择服务器的路径,这不等同于完全控制吧。
@浪潮:
并不是完全不可行的,只是感觉这样安全性很成问题,微软很可能随时修改此项安全设置的。
一般手工备份,让用户指定文件名就行了,甚至连文件名都可以不指定,直接用服务器时间当文件名。
你硬要这样的话,请google sql server folder list,其实也是有一点点可能性的,
http://stackoverflow.com/questions/11559846/how-to-list-files-inside-a-folder-with-sql-server
我感觉这条路逻辑上不通,所以没有试过,你有兴趣可以自己试试啦。
@爱编程的大叔: OK,可能是我最初的问题没有问清楚,我去试试了,thanks!
sqlserver可以通过类似于下面的sql语句得到某个目录下的文件或文件夹名称。可以通过SQL Server Profiler监控在SSMS界面操作备份选择目录的时候得到
declare @Path nvarchar(255) declare @Name nvarchar(255) select @Path = N'C:' create table #filetmpfin (Name nvarchar(255) NOT NULL, IsFile bit NULL) if(@Name is null) begin create table #filetmp (Name nvarchar(255) NOT NULL, depth int NOT NULL, IsFile bit NULL ) insert #filetmp EXECUTE master.dbo.xp_dirtree @Path, 1, 1 insert #filetmpfin select Name, IsFile from #filetmp f drop table #filetmp end if(NOT @Name is null) begin declare @FullName nvarchar(300) if(@Path is null) select @FullName = @Name else select @FullName = @Path + '\' + @Name create table #filetmp2 ( Exist bit NOT NULL, IsDir bit NOT NULL, DirExist bit NULL ) insert #filetmp2 EXECUTE master.dbo.xp_fileexist @FullName insert #filetmpfin select @Name, 1-IsDir from #filetmp2 where Exist = 1 or IsDir = 1 drop table #filetmp2 end SELECT Name AS [Name], IsFile AS [IsFile] FROM #filetmpfin ORDER BY [IsFile] ASC,[Name] ASC drop table #filetmpfin