我正在尝试编写一个程序,允许非特权技术天真的用户创建一个新的SQL Server数据库,并以.mdf
文件的形式接收它。我知道.mdf
文件并不应该被视为数据库备份,但我需要这样做以保持与现有商业软件的兼容性。
我正在使用Visual Studio 2013和SQL Server 2014,但我希望该程序能够与SQL Server版本一起使用,至少可以追溯到2008年。
我发现我无法复制
创建的.mdf
文件
CREATE DATABASE XXXXX on
(NAME=<name>,FILENAME=<filename>')
因为它最终属于(我认为)MSSQL$SQLEXPRESS
。我说“我认为”的原因是,当我转到文件属性并接受管理员权限查看所有者时,它告诉我“无法显示当前所有者”。我可以转移文件的所有权,但只能使用管理员权限。
所以我似乎无法在没有管理员权限的情况下复制.MDF
文件,这似乎相当荒谬,因为我能够创建没有这些权限的文件。我已经尝试在位于我的用户的App_Data
文件夹下的文件夹中创建该文件,并且每个人都可以完全访问子文件夹和文件,但这没有帮助。
任何人都可以建议我(以编程方式)可以为非特权用户提供此文件吗?
非常感谢你的帮助。
答案 0 :(得分:0)
在尝试复制mdf文件之前尝试以下脚本:
USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'DatabaseName';
GO
它将从SQL Server中分离数据库,您可以将其文件视为系统中的常规文件
复制后,您必须通过“ sp_attach_db ”重新附加数据库。
请注意,在此期间,SQL Server将无法显示数据库。
USE [master]
GO
EXEC master.dbo.sp_attach_db @dbname = N'DatabaseName'
, @filename1 = 'C:\Data\Datfile.mdf';
, @filename2 = 'C:\Data\Logfile.ldf';
GO
答案 1 :(得分:0)
首先将数据文件的位置放入变量中,以便在分离后可以轻松地从那里移动。
select a.filename from sys.sysfiles a inner join sys.master_files b on a.fileid=b.file_id
where b.database_id=db_id('DB_NAME')
验证数据库是否有任何打开的会话。
select spid from sysprocesses where dbid=db_id('DB_NAME')
使用[kill spid]
然后分离您的数据库
USE [master]
GO
EXEC master.dbo.sp_detach_db 'DB_NAME';
现在,您可以将数据库从变量中的来源移动到所需目的地。
现在,如果要将数据库附加到其他服务器上。
如果您将.ldf和.mdf都移动到同一目录
USE [master]
GO
EXEC master.dbo.sp_attach_db @dbname = 'DB_NAME', @filename1 = 'C:\Data\Datfile.mdf';
使用Slava Murygin先生建议的脚本附上数据库。
由于