Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
Привет, бэкаплю базу скриптом (План обслуживания-выполнить инструкцию T-Sql), на предприятии два сервера БД один на Sql 2005 Standard x86 второй на SQL 2008 R2 x64 standard. В 2008 скуле данный скрипт выполняется без проблем:

declare @dir_name as date;
declare @current_date as date = GETDATE();
declare @temp_dir_name as varchar(200);
declare @sql as varchar(200);
declare @expire_date as date = GETDATE() - 30;
declare @table as table(SUBDIR varchar(100));
declare @last_day as int;

--deny execute on master.dbo.xp_cmdshell to public

insert @table exec master.dbo.xp_subdirs N'\\pdc\g$\sql_base_backup\buh82_arc\';
DECLARE next_item CURSOR FOR select * from @table
open next_item;
WHILE (@@FETCH_STATUS = 0)
     begin
          FETCH NEXT FROM next_item into @temp_dir_name;
          set @dir_name = CONVERT(varchar, @temp_dir_name, 105);
          set @last_day = day(DATEADD (day,1,@dir_name));
          IF (@last_day <> 1) AND (@dir_name < @expire_date)
                begin
                    set @sql = N'rd /s /q \\pdc\g$\sql_base_backup\buh82_arc\' + CONVERT(varchar, @dir_name, 105);
                    exec master.dbo.xp_cmdshell @sql;
                end
      end
CLOSE next_item;
DEALLOCATE next_item;


В 2005 этот скрипт не выполняется, при чем на что-то конкретное не ругается, просто говорит, что завершено с ошибкой...
Помогите разобраться пожалуйста.

Сообщение было отредактировано: 19 мар 13, 22:57
19 мар 13, 22:50    [14069875]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
А в студии скрипт выполнить - не? Сразу бы и увидели все ошибки.

Как минимум, в 2005 нет типа date и нельзя инициализировать переменную при декларации.
Ну и никаких бекапов у вас там не делается...
19 мар 13, 23:17    [14069934]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
invm,

эта часть скрипта не отвечает непосредственно за бэкап, скрипт запускаю непосредственно из SSMS, текст ошибки:

Сообщение
Выполняется от имени пользователя: user....-разрядная) (C) Корпорация Майкрософт, 1984-2005. Все права защищены. Начало: 22:51:06 Выполнение: 2013-03-19 22:51:09.19 Источник: {BB3F9680-57AD-4E18-A233-1F68CDAC4BD0} Выполнение запроса "DECLARE @Guid UNIQUEIDENTIFIER EXECUTE msdb..sp".: 100% завершено Конец выполнения Ошибка: 2013-03-19 22:51:09.37 Код: 0xC002F210 Источник: Удаление бэкапов с истекшим сроком хранения Задача "Выполнение SQL" Описание: Сбой выполнения запроса "declare @dir_name as date; declare @current_date as date = GETDATE(); declare @temp_dir_name as varchar(200); declare @sql as varchar(200); declare @expire_date as date = GETDATE() - 30; declare @table as table(SUBDIR varchar(100)); declare @last_day as int; insert @table exec master.dbo.xp_subdirs N'\\pdc\g$\sql_base_backup\buh82_arc\'; DECLARE next_item CURSOR FOR select * from @table open next_item; WHILE (@@FETCH_STATUS = 0) ... Не удалось выполнить п... Шаг завершился с ошибкой.


Это все из-за отсутствующего типа данных?
Замена date на datetime результата не дала..
20 мар 13, 00:32    [14070141]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37254
Отладьте уже ваш скрипт в студии.
20 мар 13, 00:35    [14070150]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
mutare
Привет, бэкаплю базу скриптом (План обслуживания-выполнить инструкцию T-Sql), на предприятии два сервера БД один на Sql 2005 Standard x86 второй на SQL 2008 R2 x64 standard. В 2008 скуле данный скрипт выполняется без проблем:

declare @dir_name as date;
declare @current_date as date = GETDATE();


В 2005 этот скрипт не выполняется, при чем на что-то конкретное не ругается, просто говорит, что завершено с ошибкой...
Помогите разобраться пожалуйста.


Первые две инструкции (тип и рисвоение в момент объявления), кажется, в 2005-ом неработоспособны.
20 мар 13, 00:40    [14070161]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
исправил текст скрипта, запустил отладку в студии, убрал присвоения в объявлении, отладчик не ругнулся, ставлю выполняться план обслуживания, все равно возвращает ошибку...
исправлено было:

declare @current_date as date = GETDATE();
на

declare @current_date datetime;
set @current_date = GETDATE();
20 мар 13, 08:32    [14070518]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mutare
отладчик не ругнулся, ставлю выполняться план обслуживания, все равно возвращает ошибку...

В SSMS скрипт выполняли? От имени той учётной записи, из-под которой выполняется план обслуживания?
20 мар 13, 08:54    [14070565]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
после FETCH NEXT не проверяется @@FETCH_STATUS, поэтому за последней директорией цикл выполняется еще раз. ЯТД если это исправить - ошибка уйдет.
Кроме того, если вдруг в директории будет папка с "неправильным" именем - будет ошибка преобразования в дату
20 мар 13, 09:39    [14070724]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
после FETCH NEXT не проверяется @@FETCH_STATUS, поэтому за последней директорией цикл выполняется еще раз. ЯТД если это исправить - ошибка уйдет.

Более того, команда OPEN не меняет значение @@FETCH_STATUS. Если открыть в новом окне SSMS скрипт с подобной структурой:
DECLARE @name sysname;
DECLARE next_item CURSOR FOR SELECT TOP(1) name FROM sys.tables ORDER BY name;
OPEN next_item;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    FETCH NEXT FROM next_item into @name;
    PRINT @name;
END;
CLOSE next_item;
DEALLOCATE next_item;
и понажимать F5, то цикл выполнится только при первом запуске, а при последующих — нет.
20 мар 13, 09:59    [14070805]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
Гость333,

на оба вопроса- да
20 мар 13, 11:19    [14071162]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
Гость333
Cygapb-007
после FETCH NEXT не проверяется @@FETCH_STATUS, поэтому за последней директорией цикл выполняется еще раз. ЯТД если это исправить - ошибка уйдет.

Более того, команда OPEN не меняет значение @@FETCH_STATUS. Если открыть в новом окне SSMS скрипт с подобной структурой:
DECLARE @name sysname;
DECLARE next_item CURSOR FOR SELECT TOP(1) name FROM sys.tables ORDER BY name;
OPEN next_item;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    FETCH NEXT FROM next_item into @name;
    PRINT @name;
END;
CLOSE next_item;
DEALLOCATE next_item;
и понажимать F5, то цикл выполнится только при первом запуске, а при последующих — нет.


Это касается только sql 2005? Потому что в 2008r2 все выполняется корректно.
20 мар 13, 11:24    [14071189]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
mutare
Это касается только sql 2005? Потому что в 2008r2 все выполняется корректно.

Это везде так. начиная с версии 7. Достаточно открыть хелп и прочитать, что @@FETCH_STATUS является статусом последнй команды FETCH, а не какой либо другой
20 мар 13, 11:27    [14071207]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mutare,

Это касается любой версии MSSQL, от 2000 до 2012 включительно.
20 мар 13, 11:28    [14071211]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
Гость333,

тогда не пойму почему же в 2008 все работает...
20 мар 13, 11:33    [14071230]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
mutare
тогда не пойму почему же в 2008 все работает...

работает это длявас выполняется без ошибок или выполняет нужные действия ?
20 мар 13, 11:38    [14071255]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
mutare
Member

Откуда:
Сообщений: 8
Glory,

выполняется без ошибок, но не выполняет нужные действия, в итоге разобрался. Скрипт стал работать в таком виде:

eclare @dir_name as datetime;
declare @current_date as datetime;
declare @temp_dir_name as varchar(200);
declare @sql as varchar(200);
declare @expire_date as datetime;
declare @table as table(SUBDIR varchar(100));
declare @last_day as int;

grant execute on master.dbo.xp_cmdshell to public
set @current_date = GETDATE();
set @expire_date = GETDATE() - 30;
insert @table exec master.dbo.xp_subdirs N'\\pdc\g$\sql_base_backup\buh82_arc\';
DECLARE next_item CURSOR FOR select * from @table
open next_item;
WHILE (@@FETCH_STATUS = 0)
begin
FETCH NEXT FROM next_item into @temp_dir_name;
set @dir_name = CONVERT(varchar, @temp_dir_name, 105);
set @last_day = day(DATEADD (day,1,@dir_name));
IF (@last_day <> 1) AND (@dir_name < @expire_date)
begin
set @sql = N'rd /s /q \\pdc\g$\sql_base_backup\buh82_arc\' + CONVERT(varchar, @dir_name, 105);
exec master.dbo.xp_cmdshell @sql;
end
end
CLOSE next_item;
DEALLOCATE next_item;

После того как была выполнена данная инструкция

exec sp_configure 'show advanced options', 1
go
RECONFIGURE
go

exec sp_configure 'xp_cmdshell', 1
go
RECONFIGURE
go
20 мар 13, 13:40    [14071976]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ех.....DECLARE CURSOR
20 мар 13, 13:49    [14072028]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mutare
выполняется без ошибок, но не выполняет нужные действия

Скрипт стал работать в таком виде:

После того как была выполнена данная инструкция

exec sp_configure 'xp_cmdshell', 1

Что-то вы нас путаете. Если настройка xp_cmdshell была отключена, то у вас должно было выдаваться сообщение:
Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.
20 мар 13, 13:52    [14072049]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
Гость333
Member

Откуда:
Сообщений: 3683
mutare
Скрипт стал работать в таком виде:

Ошибку с FETCH так и не исправили...
20 мар 13, 13:54    [14072055]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
grant execute on master.dbo.xp_cmdshell to public


- убивать!
21 мар 13, 00:16    [14074927]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковый скрипт в sql2005 и sql2008r2  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
...
open next_item;
FETCH NEXT FROM next_item into @temp_dir_name;
WHILE (@@FETCH_STATUS = 0)
begin
FETCH NEXT FROM next_item into @temp_dir_name;
set @dir_name = CONVERT(varchar, @temp_dir_name, 105);
set @last_day = day(DATEADD (day,1,@dir_name));
IF (@last_day <> 1) AND (@dir_name < @expire_date)
begin
set @sql = N'rd /s /q \\pdc\g$\sql_base_backup\buh82_arc\' + CONVERT(varchar, @dir_name, 105);
exec master.dbo.xp_cmdshell @sql;
end
FETCH NEXT FROM next_item into @temp_dir_name;
end
CLOSE next_item;
...
21 мар 13, 00:20    [14074951]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить