2017-06-05 18 views
1

私はローカルのSqlExpressデータベースでデータベースをバックアップするために以下のコードを使用しています。ユーザーはデータベースを復元する権限を持っていません

procedure RestoreScoreDb(DBName,OldName,BackName : String); 
    var 
    cmd : WideString; 
    SqlBackupDir : String; 
    SqlDataDir : String; 
    begin 
    Try 
    ConnectionMaster.Connected := False; 
    ConnectionMaster.Close; 
    ConnectionMaster.ConnectionString := 'Provider=SQLNCLI11.1;Integrated  Security="";Persist Security Info=False;User ID=SA;Password=Tccc1234;OLE DB Services=-2;Initial Catalog="master";Data Source=\SQLEXPRESS;Initial File Name="";Packet Size=4096;Auto Translate=True;Server SPN=""'; 
    SqlBackupDir := ReadIniStr(IniCfg,'Dir','SqlBackup'); 
    SqlDataDir := ReadIniStr(IniCfg,'Dir','SqlData'); 
    cmd := 'RESTORE DATABASE '+DBName; 
    cmd := Cmd + ' FROM DISK = N'''+SqlBackupDir+'\'+BackName+''''; 
    cmd := Cmd + ' WITH FILE = 1'; 
    cmd := cmd + ' , MOVE N'''+OldName+''' TO N'''+SqlDataDir+'\'+DBName+'.mdf'''; 
    cmd := cmd + ' , MOVE N'''+OldName+'_log'' TO N'''+SqlDataDir+'\'+DBName+'.ldf'''; 
    cmd := cmd + ' , NOUNLOAD, REPLACE, STATS = 10'; 
    CmdRestore.CommandText := cmd; 
    CmdRestore.Connection := ConnectionMaster; 
    CmdRestore.Execute; 
    except 
    on E: Exception do 
    writeln(LogFile,'RestoreScoreDb = '+E.Message); 
    end; 
    end; 

復元コマンドは

cmd ='RESTORE DATABASE score_import FROM DISK = 
N''C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\score_import.bak'' 
WITH FILE = 1 , MOVE N''score_import'' TO 
N''C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\score_import.mdf'' , 
MOVE N''score_import_log'' TO N''C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\score_import.ldf'' , 
NOUNLOAD, REPLACE, STATS = 10' 

私は管理スタジオにコピー&ペーストすると、それは問題なく、テーブルを復元しています。このコードを実行すると、エラーが発生します。

User does not have permission to RESTORE database "score_import"

SAにはフルアクセス権があります。私の欠点は何ですか? Delphi XE6、Windows 10 Sql 2012.

+0

Integrated Security = ""をIntegrated Security = Falseに変更するとわかりません。 –

+0

Thanks @RachellAmber私はこれを試してみたところ、 "Operation generated error"がある場合、各OLEステータス値を確認します。 。 –

+0

私はここに投稿したコードを試してみることができます:stackoverflow.com/questions/43059879/...あなたが同じ問題を抱えているかどうかを確認してください。もしあなたのDelphiバージョンにFireDACがないなら、TAdoQueryと同様にすることができます。あなたが既にAdoを使用しているように、私はあなたのようにあなたの質問に答えてくれるでしょう – MartynA

答えて

1

Embarcaderoサポートに感謝します。彼らは私の問題を再現し、Integrated Security=""を接続文字列から削除することで解決することができました。理由を知りたい場合は、Google検索で「ADO統合セキュリティ」を検索してください。

関連する問題