Ошибка присоединения базы данных SQL Server (не проблема разрешения)

Я застрял при попытке выяснить эту ошибку, без всякой удачи. Я уже прошел SO, нашел несколько кусочков, чтобы помочь мне понять это.

Мне нужно создать запланированное задание, которое будет копировать и переименовывать базу данных 1 января, поэтому никому не нужно делать это вручную.

Это код, который отлично работает:

EXEC sp_renamedb 'ugocity', 'ugocity1'
GO

EXEC sp_detach_db @dbname = 'ugocity1'
GO

EXEC sp_configure 'show advanced options' , 1
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell' , 1
RECONFIGURE
GO
EXEC xp_cmdshell
    'md C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
GO
EXEC xp_cmdshell
    'RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity2017.mdf", "ugocity1.mdf"'
GO
EXEC xp_cmdshell
    'RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity2017_1.ldf", "ugocity1_log.ldf"'
GO

EXEC sp_configure 'xp_cmdshell' , 0
RECONFIGURE
GO
EXEC sp_configure 'show advanced options' , 0
RECONFIGURE
GO

EXEC sp_attach_db @dbname = 'ugocity1'
, @filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1.mdf'
, @filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1_log.ldf'

GO

Однако имя новой базы данных должно содержать год. Таким образом, это должно быть, например, "ugocity2017". Итак, после трех часов поиска в сети я придумал следующее:

DECLARE @newname varchar(500), @newmdf varchar(500), @newldf varchar (500), @yearnum int, @prevyear int,
    @command1 varchar(max), @command2 varchar(max), @command3 varchar(max), @command4 varchar(max), @command5 varchar(max)

    SET @yearnum = YEAR(GETDATE())
    SET @prevyear = @yearnum - 2000

    SET @newname = 'ugocity' + CONVERT(varchar(4),@prevyear)
    SET @newmdf = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\' + @newname +'.mdf'
    SET @newldf = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocitylog.ldf'

    SET @command1 = 'sp_renamedb ''ugocity2017'', ''' + @newname + ''''
    SET @command2 = 'xp_cmdshell ''RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity2017.mdf", "' + @newname + '.mdf"'''
    SET @command3 = 'xp_cmdshell ''RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1_log.mdf", "ugocitylog.ldf"'''
    SET @command4 = 'sp_detach_db @dbname = ''' + @newname + ''''
    SET @command5 = 'sp_attach_db @dbname = ''' + @newname + ''' , ' + ' @filename1 = ''' + @newmdf + ''' , ' + '@filename2 = ''C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocitylog.ldf'''

    EXECUTE (@command1)

    USE [master]

    EXECUTE (@command4)

    EXECUTE sp_configure 'show advanced options' , 1
    RECONFIGURE

    EXECUTE sp_configure 'xp_cmdshell' , 1
    RECONFIGURE

    EXECUTE (@command2)

    EXECUTE xp_cmdshell 'RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1_log.mdf", "ugocitylog.ldf"'

    EXECUTE sp_configure 'xp_cmdshell' , 0
    RECONFIGURE

    EXECUTE sp_configure 'show advanced options' , 0
    RECONFIGURE

    EXECUTE (@command5)

Когда я запускаю первый, база данных и ее физические файлы переименовываются без ошибок. Когда я запускаю второй код, база данных и файл.mdf переименовываются, но.ldf остается прежним, и я получаю:

Msg 5120, уровень 16, состояние 101, строка 1
Невозможно открыть физический файл "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocitylog.ldf". Ошибка операционной системы 2: "2(система не может найти указанный файл.)"

Разрешения, буквально, полный контроль.

Кто-нибудь еще сталкивался с этой ошибкой? Я просто не могу понять это.

1 ответ

Да, проблема не может быть в вашем коде, так что смотрите в другом месте. У вас есть 5 разных командных строк. Какие из них вы на самом деле исполняете? Но зачем беспокоиться о сложных сценариях, которые вы слишком нетерпеливы для отладки. Вы можете выполнить все, что вам нужно сделать, используя команду восстановления. Это включает в себя изменение имени базы данных и переименование физических файлов. SSMS сделает это за вас, и вы можете просмотреть / использовать сценарий, который он генерирует.

На общей странице выберите "устройство" и выберите файл резервной копии. Укажите новое имя для базы данных в месте назначения. На странице файлов измените физические имена файлов для всех фактических файлов в списке восстановления в виде. Затем нажмите кнопку "Сценарий" в верхней части диалогового окна, а не кнопку "ОК" в нижней части.

Другие вопросы по тегам