Andy Lanng Ответов: 2

C# восстановление базы данных с помощью microsoft. sqlserver.management. smo 5(доступ запрещен)


Эй,

Я пытаюсь восстановить БД с помощью Microsoft.SqlServer.Management.Smo но мне все время отказывают в доступе.

Я настроил пользователя службы для экземпляра (MSSQL$LOCAL2016) с полными правами доступа к папке
Папка является папкой по умолчанию для экземпляра (хотя то же самое нельзя сказать, когда я перехожу к производству)
Я создаю папки в C#
rstDatabase.SqlRestore(sqlServer); завершается с ошибкой:
Цитата:
Операционная система вернула ошибку "5(Доступ запрещен.)" при попытке "RestoreContainer:: ValidateTargetForCreation" on "C:\Database\Rates.setuptest\Data".
Файл 'RateUploader' не может быть восстановлен в 'C:\Database\Rates.setuptest\Data". Использовать с ходу определить действительное местоположение файла.
Операционная система вернула ошибку "5(Доступ запрещен.)" при попытке "RestoreContainer:: ValidateTargetForCreation" on "C:\Database\Rates.setuptest\Logs".
Файл 'RateUploader_log' не может быть восстановлен в 'C:\Database\Rates.setuptest\Logs". Использовать с ходу определить действительное местоположение файла.
Проблемы были выявлены при планировании инструкции RESTORE. Предыдущие сообщения содержат подробную информацию.
Восстановление базы данных завершается ненормально.



Кажется, достаточно прямолинейно. Упускаю ли я очевидное или есть что-то тонкое, чего я не осознаю?

Спасибо ^_^
Энди

Что я уже пробовал:

public static bool RestoreDatabase(String databaseName)
{
	MySqlConnectionStringBuilder stringBuilder = new MySqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["adminSqlAccess"].ConnectionString);
	
	string serverName = stringBuilder.Server, userName = stringBuilder.UserID, password = stringBuilder.Password, 
		pFileLocation = string.Format(ConfigurationManager.AppSettings["dbPath"], databaseName, "Data"), 
		lFileLocation = string.Format(ConfigurationManager.AppSettings["dbPath"], databaseName, "Logs"),
		bakFileLocation = ConfigurationManager.AppSettings["bakDbPath"];
		
	if (!Directory.Exists(pFileLocation))
		Directory.CreateDirectory(pFileLocation);
	if (!Directory.Exists(lFileLocation))
		Directory.CreateDirectory(lFileLocation);

	ServerConnection connection = new ServerConnection(serverName, userName, password);
	Server sqlServer = new Server(connection);
	Restore rstDatabase = new Restore();
	rstDatabase.Action = RestoreActionType.Database;
	rstDatabase.Database = $"Rates.{databaseName}";

	rstDatabase.RelocateFiles.Add(new RelocateFile("RateUploader", pFileLocation));
	rstDatabase.RelocateFiles.Add(new RelocateFile("RateUploader_log", lFileLocation));

	BackupDeviceItem bkpDevice = new BackupDeviceItem(bakFileLocation, DeviceType.File);
	rstDatabase.Devices.Add(bkpDevice);
	rstDatabase.ReplaceDatabase = true;
	rstDatabase.SqlRestore(sqlServer);

	return true;
}


Конфиг:
<connectionStrings>
  <add name="adminSqlAccess" connectionString="Data Source=.\LOCAL2016;Initial Catalog=SystemManager2.0;Persist Security Info=True;User ID=sa;Password=xxxxxxxx" />
</connectionStrings>
<appSettings>
  <!-- ... -->
  <add key="dbPath" value="C:\Database\{0}\{1}"/>
  <add key="bakDbPath" value="C:\Database\blank\20170228-blank.bak"/>
</appSettings>

2 Ответов

Рейтинг:
8

Andy Lanng

О, ради всего святого!

Я опустил имя файла из путей перемещения >_ & lt;

Честно говоря, "перемещение" действительно подразумевает перемещение из одной папки в другую, а также сообщение об ошибке идентично проблемам с разрешениями, с которыми, похоже, столкнулось большинство людей


Рейтинг:
1

OriginalGriff

То как я это делаю здесь: Резервное копирование базы данных SQL на языке C#[^]- и обычно я получаю сообщение о нарушении доступа наоборот, когда пытаюсь сохранить резервную копию. Однако, вероятно, это та же проблема - SQL не запускается под вашим идентификатором пользователя, поэтому для восстановления папки назначения требуются соответствующие разрешения.


Andy Lanng

Ха-ха - мой идентификатор пользователя не MSSQL$LOCAL2016
Я использовал Настройка разрешений файловой системы для доступа к ядру базы данных[^], который сказал, чтобы я поставил УО ID пользователя экземпляра. Я попробую "сетевые сервисы", предложенные моей вашей ссылкой, но VS просто разбился... снова. 2015 год, кажется, делает это один или два раза в день. Время для переезда в 2017 году, думаю я.

Andy Lanng

Не повезло с сервисы пользователей Сети либо

OriginalGriff

Возможно, вам захочется проверить зал ожидания со вчерашнего дня, прежде чем вы обновите VS...

Я подозреваю, что это папка назначения, которую вы создаете - она будет создана под идентификатором пользователя приложения, создающего ее, а не под пользователем экземпляра SQL, - так что вполне вероятно, что SQL не имеет доступа к этой папке и поэтому не может ее восстановить. Проверьте права доступа к папке в Проводнике и посмотрите, кто, по его словам, может что-то делать.

Andy Lanng

Проверил новую папку и дочерние папки. Как пользователь MSSQL, так и пользователь сетевых служб распространяются с полными правами доступа :/
Я собираюсь покопаться в ошибке и посмотреть, скажет ли она мне, какого пользователя она на самом деле пытается использовать

Andy Lanng

Даже не работает для "всех" с полным доступом