2016-06-17 2 views
0

J'essaye d'écrire un programme pour permettre à un utilisateur techniquement naïf non privilégié de créer une nouvelle base de données SQL Server et de le recevoir sous la forme d'un fichier .mdf. Je comprends que les fichiers .mdf ne sont pas vraiment censés être traités comme des sauvegardes de bases de données, mais je dois le faire de cette façon pour maintenir la compatibilité avec les logiciels commerciaux existants qui fonctionnent comme ça.Autorisations sur le nouveau fichier mdf

J'utilise Visual Studio 2013 et SQL Server 2014, bien que je voudrais que le programme soit en mesure de travailler avec des versions de SQL Server qui remonte au moins à 2008.

Ce que je trouve est que je peux « t copier le fichier .mdf créé par

CREATE DATABASE XXXXX on 
(NAME=<name>,FILENAME=<filename>') 

parce qu'il finit par appartenance (je pense) à MSSQL$SQLEXPRESS. La raison pour laquelle je dis 'je pense' est que quand je vais dans les propriétés du fichier et accepte les privilèges d'administrateur pour voir le propriétaire, il me dit 'Impossible d'afficher le propriétaire actuel.' Je peux transférer la propriété du fichier, mais seulement en utilisant les privilèges d'administrateur.

Il semble donc que je ne peux pas copier le fichier .MDF sans privilèges d'administrateur, ce qui semble assez ridicule étant donné que j'ai pu créer le fichier sans ces privilèges. J'ai essayé de créer le fichier dans un dossier situé sous le dossier App_Data de mon utilisateur et avec un accès complet pour tout le monde aux sous-dossiers et fichiers, mais cela n'a pas aidé.

Quelqu'un peut-il me suggérer ce que je peux faire (par programmation) pour rendre ce fichier accessible à un utilisateur non privilégié?

Un grand merci pour votre aide.

Répondre

0

Essayez script suivant avant d'essayer de copier mdf fichier:

USE [master] 
GO 
EXEC master.dbo.sp_detach_db @dbname = N'DatabaseName'; 
GO 

Il détachera la base de données de SQL Server et vous pouvez le traiter est des fichiers sous forme de fichiers réguliers dans un système.
Après la copie, vous devez rattacher la base de données par "sp_attach_db". Notez que pendant cette période, la base de données ne sera pas visible par 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 
0
  1. emplacement du premier get des fichiers de données dans une variable, de sorte que vous pouvez easly déplacer à partir de là après vous détachez.

    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. Vérifiez s'il existe une session ouverte avec la base de données.

    select spid from sysprocesses where dbid=db_id('DB_NAME') 
    
  3. Tuez tous les sessions en utilisant [tuer SPID]

  4. détachez votre base de données

    USE [master] 
    GO 
    EXEC master.dbo.sp_detach_db 'DB_NAME'; 
    
  5. Maintenant, vous pouvez déplacer la base de données de la source holded dans la variable à destination souhaitée .

Maintenant si vous voulez joindre la base de données sur un autre serveur.

  1. Si vous avez déménagé à la fois .ldf et .mdf au même répertoire

    USE [master] 
    GO 
    EXEC master.dbo.sp_attach_db @dbname = 'DB_NAME', @filename1 = 'C:\Data\Datfile.mdf'; 
    
  2. Si vous déplaciez .ldf et .mdf pour séparer le répertoire.

Utilisez le script suggéré par M. Slava Murygin ici pour joindre la base de données.

Merci

+0

Merci à vous deux pour votre aide. Je regardais au mauvais endroit, pensant que le problème était avec les privilèges de fichiers plutôt que le fait que le fichier était toujours attaché à une base de données. – Jonathan