powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с запросом в джобе
3 сообщений из 3, страница 1 из 1
Проблема с запросом в джобе
    #39787652
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть база на проде, есть тестовый сервер на котором каждую ночь база должна перезаписываться свежей версией прода.
Данные по последний бекапом собираются отдельным заданием в таблицу, линкед сервер есть. Проблема возникает на этапе восстановления.
Запуск процедуры просто из окна нового запроса работает, полученный с помощью print текст из джоба работает, а вот такой же запуск процедуры с параметрами из джоба падает с ошибкой.

User does not have permission to alter database 'Test_DB', the database does not exist, or the database is not in a state that allows access checks. [SQLSTATE 42000] (Error 5011) ALTER DATABASE statement failed. [SQLSTATE 42000] (Error 5069) Database 'Test_DB' does not exist. Make sure that the name is entered correctly. [SQLSTATE 08004] (Error 911). The step failed.

Права у у\з и в SQL Server и на папку есть, база в состояние ресторинг не переходит. Пока больше похоже, что в скрипте плохо задал разбивку на этапы и сам шаг рестора почему-то из джоба пропускает. Просьба подсказать, что задал в скрипте неверно.


Код: sql
1.
2.
exec NEW_DB 'Prod_DB', 'Test_DB','user_abc'
GO




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
USE [master]
GO
/****** Object:  StoredProcedure [dbo].[NEW_DB]    Script Date: 18.03.2019 9:26:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[NEW_DB] 

	@dbname nvarchar(30),
    @newdbname nvarchar(30),
	@user nvarchar(20) 
	
AS
BEGIN

	SET NOCOUNT ON;

	DECLARE @sql nvarchar(2000)
	DECLARE @full_bkp_path nvarchar(250)
	DECLARE @diff_bkp_path nvarchar(250)
	DECLARE @full_date datetime
	DECLARE @diff_date datetime
	DECLARE @diff_sql nvarchar(250)

	declare @LnameData nvarchar(100)
	declare @LnameLog nvarchar(100)
	
	set @LnameData = 
(select 
f.name as logical_name
from [prod-serv].[master].[sys].[master_files] f
 inner join [prod-serv].[master].[sys].[databases] d
 on f.[database_id] =
 d.[database_id] 
 where d.name  = @dbname 
 and f.type_desc = 'ROWS'
 )
  
 set @LnameLog = 
(select 
f.name as logical_name
from [prod-serv].[master].[sys].[master_files] f
 inner join [prod-serv].[master].[sys].[databases] d
 on f.[database_id] =
 d.[database_id] 
 where d.name  = @dbname 
 and f.type_desc = 'LOG'
 )

	SELECT @full_bkp_path = physical_device_name, @full_date = backup_start_date
	FROM backups.dbo.backups
	WHERE type = 'D' and database_name = @dbname

	SELECT @diff_bkp_path = physical_device_name, @diff_date = backup_start_date
	FROM backups.dbo.backups
	WHERE type = 'I' AND database_name = @dbname

	IF (@diff_date < @full_date) SET @diff_sql = ''
	ELSE SET @diff_sql = 'RESTORE DATABASE ' + @newdbname + ' FROM DISK = N''' + @diff_bkp_path + ''' WITH FILE = 1, NOUNLOAD, NORECOVERY, STATS = 5;
'

IF Exists (select name from sys.databases where name = @newdbname)
Begin
	SET @sql = 'USE [master];
ALTER DATABASE ' + @newdbname + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'
exec sp_executesql @sql
END

BEGIN	
	SET @sql =
'USE [master];
RESTORE DATABASE ' + @newdbname + ' FROM DISK = N''' + @full_bkp_path + ''' WITH FILE = 1,
MOVE N''' + @LnameData + ''' TO N''C:\SQL\' + @newdbname + '.mdf'', MOVE N''' + @LnameLog + ''' TO N''C:\SQL\' + @newdbname + '_log.ldf'', 
NOUNLOAD, NORECOVERY,  REPLACE,  STATS = 5;
'
+ @diff_sql + 
'
RESTORE DATABASE ' + @newdbname + ' WITH RECOVERY;'
exec sp_executesql @sql

END

SET @sql =
'USE [master]; ALTER DATABASE ' + @newdbname + ' SET MULTI_USER;'
exec sp_executesql @sql

SET @sql =

'USE ' + @newdbname + ';

DROP USER [' +  @user + '];

CREATE USER [' + @user + '] FOR LOGIN [' + @user + '];

USE ' + @newdbname + ';

ALTER ROLE [db_owner] ADD MEMBER [' + @user + '];

USE [master];

ALTER DATABASE ' + @newdbname + ' SET RECOVERY SIMPLE WITH NO_WAIT;
'
exec sp_executesql @sql

END
...
Рейтинг: 0 / 0
Проблема с запросом в джобе
    #39787796
Slava_Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставьте якоря в виде принтов или seleсt чтобы определить где затык.
Судя по коду в переводите в Single режим а дальше пытаетесь восстанавливать и вам не дается это.
Попробуйте сделать в одной команде этот код, либо дропайте бд и восстаналивайте с указанием путей а не перезаписывая.

IF Exists (select name from sys.databases where name = @newdbname)
Begin
SET @sql = 'USE [master];
ALTER DATABASE ' + @newdbname + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'
exec sp_executesql @sql
END

BEGIN
SET @sql =
'USE [master];
RESTORE DATABASE ' + @newdbname + ' FROM DISK = N''' + @full_bkp_path + ''' WITH FILE = 1,
MOVE N''' + @LnameData + ''' TO N''C:\SQL\' + @newdbname + '.mdf'', MOVE N''' + @LnameLog + ''' TO N''C:\SQL\' + @newdbname + '_log.ldf'',
NOUNLOAD, NORECOVERY, REPLACE, STATS = 5;
'
+ @diff_sql +
'
RESTORE DATABASE ' + @newdbname + ' WITH RECOVERY;'
exec sp_executesql @sql

END
...
Рейтинг: 0 / 0
Проблема с запросом в джобе
    #39787883
Danion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slava_Nik,

Не, проблема вроде не в сингл юзере. Для варианта, где нет базы посмотрел код - там части про перевод нет, что правильно. А дальше пропускается часть с восстановлением и идут ошибки по переводу несуществующей базы в симпл, добавление пользователя.
Вот код, при отсутствии БД. И сейчас выдало ошибку сразу. Нужно как-то принудительно разделить части USE [master]; ALTER DATABASE test_res и SET MULTI_USER;
USE test_res;

Помогает добавление GO, но он для других целей в процедуре вроде не работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
USE [master];
RESTORE DATABASE test_res FROM DISK = N'\\serv-bk-01\Backup\MSSQL\Full\Prod_db\Prod_db_backup_2019_03_16_010001_6905791.bak' WITH FILE = 1,
MOVE N'MIS' TO N'C:\SQL\test_res.mdf', MOVE N'MIS_log' TO N'C:\SQL\test_res_log.ldf', 
NOUNLOAD, NORECOVERY,  REPLACE,  STATS = 5;
RESTORE DATABASE test_res FROM DISK = N'\\serv-bk-01\Backup\MSSQL\Diff\Prod_db\Prod_db_backup_2019_03_18_010001_4636191.bak' WITH FILE = 1, NOUNLOAD, NORECOVERY, STATS = 20;

RESTORE DATABASE test_res WITH RECOVERY;
USE [master]; ALTER DATABASE test_res SET MULTI_USER;
USE test_res;

DROP USER [userabc];

CREATE USER [userabc] FOR LOGIN [userabc];

USE test_res;

ALTER ROLE [db_owner] ADD MEMBER [userabc];

USE [master];

ALTER DATABASE test_res SET RECOVERY SIMPLE WITH NO_WAIT;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с запросом в джобе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]