|
|
#1 |
|
Участник
|
Выполнение бэкапа БД из кода
Доброго дня! Возникла потребность вызывать создания бэкапа (также хотел вызывать пересчет индексов, но с ним такая же проблема) во время длительной операции. Решил создавать из кода, но вылазит ошибка: "Сбой запроса на разрешение типа "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(); } SQL Server 20.2.37.0 |
|
|
|
|
#2 |
|
Участник
|
Джобы всегда выполняются на стороне клиента, вне зависимости от указания опции 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). | |
|
|
#3 |
|
Участник
|
После правки серверного режима ошибка с правами ушла, но бэкап почему-то не хотел создаваться (вернее файл создавался, но удалялся и бэкап падал с ошибкой, по логам не смог понять в чем дело). Решил попробовать подключиться через оледб - помогло, бэкап начал создаваться
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). | |