AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.02.2026, 11:41   #1  
Mifeus is offline
Mifeus
Участник
 
4 / 15 (1) ++
Регистрация: 09.12.2024
Выполнение бэкапа БД из кода
Доброго дня! Возникла потребность вызывать создания бэкапа (также хотел вызывать пересчет индексов, но с ним такая же проблема) во время длительной операции. Решил создавать из кода, но вылазит ошибка: "Сбой запроса на разрешение типа "SqlStatementExecutePermission""

В SQL аккаунт АОСа админ. Также пробовал отдельно ему дать bakupoperator - не помогло.

X++:
static server void tryBackUp(Args _args)
{
    SqlStatementExecutePermission   sqlStatementExecutePermission;
    str                             strSQL;
    Connection                      connection  = new Connection();
    Statement                       statement   = connection.createStatement();

    SysSQLSystemInfo                SQLSystemInfo = SysSQLSystemInfo::construct();

    date m_dateBackUp = systemDateGet();

    Filename m_backUpFileName = "E:\\file.bak";

    str _backupName = 'test';
    ;
    
    strSQL = StrFmt("BACKUP DATABASE [%1]"
                    + " TO DISK = N'%2'"
                    + " WITH COMPRESSION,"
                    + " NOFORMAT,"
                    + " NOINIT,"
                    + " NAME = N'%3',"
                    + " SKIP,"
                    + " NOREWIND,"
                    + " NOUNLOAD",
                     SQLSystemInfo.getloginDatabase(),
                     m_backUpFileName,
                     _backupName);

    sqlStatementExecutePermission = new SqlStatementExecutePermission(strSQL);
    sqlStatementExecutePermission.assert();
    
    statement.executeUpdate( strSQL );

    CodeAccessPermission::revertAssert();
}
Axapta 2012 6.3.6000.151
SQL Server 20.2.37.0
Старый 02.02.2026, 12:49   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,732 / 1220 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Джобы всегда выполняются на стороне клиента, вне зависимости от указания опции Server. В этом случае и будет такое сообщение

Чтобы запустить джоб на стороне сервера, используют такой прием

X++:
static void Job_Test(Args _args)
{
    MenuFunction    mf;
    ;

    // перезапускаем job на стороне сервера
    if ( ! isRunningOnServer())
    {
        mf = classFactory::makeObjectOnServer(classNum(MenuFunction));
        mf.objectType(MenuItemObjectType::Job);
        mf.runOn(ClassRunMode::Server);
        mf.object(funcName());
        mf.run();
        return;
    }
 
// код джоба
   
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Mifeus (1).
Старый 02.02.2026, 15:10   #3  
Mifeus is offline
Mifeus
Участник
 
4 / 15 (1) ++
Регистрация: 09.12.2024
После правки серверного режима ошибка с правами ушла, но бэкап почему-то не хотел создаваться (вернее файл создавался, но удалялся и бэкап падал с ошибкой, по логам не смог понять в чем дело). Решил попробовать подключиться через оледб - помогло, бэкап начал создаваться


X++:
static void tryBackUpOLEDB(Args _args)
{
    System.Exception                    e;
    System.Data.OleDb.OleDbConnection   objConn;
    System.Data.OleDb.OleDbCommand      cmdSelect;
    InteropPermission                   perm;
    SysSQLSystemInfo                SQLSystemInfo = SysSQLSystemInfo::construct();
    
    str connectStr = "Provider=MSOLEDBSQL.1;Integrated Security=SSPI;"+
                     strFmt("Persist Security Info=False;Initial Catalog=%1;Data Source= %2 ", SQLSystemInfo.getloginDatabase(), SQLSystemInfo.getLoginServer());
    str exceptionStr;
    
    MenuFunction    mf;
    
    date m_dateBackUp = systemDateGet();

    Filename m_backUpFileName = "E:\\file.bak";

    str _backupName = 'test2';
    
    str strSQL;
    ;
    
    if ( ! isRunningOnServer())
    {
        mf = classFactory::makeObjectOnServer(classNum(MenuFunction));
        mf.objectType(MenuItemObjectType::Job);
        mf.runOn(ClassRunMode::Server);
        mf.object(funcName());
        mf.run();
        return;
    }

    strSQL = StrFmt("BACKUP DATABASE [%1]"
                    + " TO DISK = N'%2'"
                    + " WITH COMPRESSION,"
                    + " NOFORMAT,"
                    + " NOINIT,"
                    + " NAME = N'%3',"
                    + " SKIP",
                     SQLSystemInfo.getloginDatabase(),
                     m_backUpFileName,
                     _backupName);
    
    try
    {
        perm = new InteropPermission(InteropKind::ClrInterop);
        if (perm == null)
        {
            throw error("Error with file permissions");
        }
        perm.assert();
        objConn = new System.Data.OleDb.OleDbConnection(connectStr);
        objConn.Open();
        cmdSelect   = objConn.CreateCommand();
        cmdSelect.set_CommandText(strSQL);
        cmdSelect.ExecuteReader();
    }
    catch(Exception::CLRError)
    {
        CodeAccessPermission::revertAssert();
        perm = new InteropPermission(InteropKind::ClrInterop);
        if (perm == null)
        {
            return;
        }
        perm.assert();
        e = ClrInterop::getLastException();
        CodeAccessPermission::revertAssert();
        while( e )
        {
            exceptionStr += e.get_Message();
            e = e.get_InnerException();
        }
        info(exceptionStr);
    }
    catch
    {
        error("An Exception has occurred");
    }
    if(objConn)
        objConn.Close();
}

Последний раз редактировалось Mifeus; 02.02.2026 в 15:16.
За это сообщение автора поблагодарили: sukhanchik (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Выполнение кода на стороне SQL Server dech DAX: Программирование 29 12.11.2014 17:56
Выполнение кода .Net в AX Stainless DAX: Программирование 2 10.06.2011 14:29
Channel9: Peter Villadsen and Gustavo Plancarte: X++ to MSIL Blog bot DAX Blogs 30 24.08.2010 17:11
Подключение АОС к новой БД AxaptaUser DAX: Администрирование 4 07.04.2008 16:09
Как из кода завершить выполнение текущей сессии клиента? ravil DAX: Программирование 2 25.09.2003 08:21

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:53.