新mdf文件

时间:2016-06-17 00:50:22

标签: sql-server file-access

我正在尝试编写一个程序,允许非特权技术天真的用户创建一个新的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文件夹下的文件夹中创建该文件,并且每个人都可以完全访问子文件夹和文件,但这没有帮助。

任何人都可以建议我(以编程方式)可以为非特权用户提供此文件吗?

非常感谢你的帮助。

2 个答案:

答案 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)

  1. 首先将数据文件的位置放入变量中,以便在分离后可以轻松地从那里移动。

    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')
    
  2. 验证数据库是否有任何打开的会话。

    select spid from sysprocesses where dbid=db_id('DB_NAME')
    
  3. 使用[kill spid]

  4. 杀死所有会话
  5. 然后分离您的数据库

    USE [master]
    GO
    EXEC master.dbo.sp_detach_db 'DB_NAME';
    
  6. 现在,您可以将数据库从变量中的来源移动到所需目的地。

  7. 现在,如果要将数据库附加到其他服务器上。

    1. 如果您将.ldf和.mdf都移动到同一目录

      USE [master]
      GO
      EXEC master.dbo.sp_attach_db @dbname = 'DB_NAME', @filename1 = 'C:\Data\Datfile.mdf';
      
    2. 如果您将.ldf和.mdf移动到单独的目录。
    3. 使用Slava Murygin先生建议的脚本附上数据库。

      由于