28.12.2018, 06:50 | #1 |
Участник
|
Запуск скрипта из аксапты и получение результата на форму AX
Добрый день уважаемые программисты!
Версия системы AX 4.0 Имеется очень полезный скрипт на SQL сервере, который отображает блокировки. Приведу его, возможно кому нибудь пригодится. CREATE TABLE #sp_who2 (SPID INT,Status VARCHAR(255), Login VARCHAR(255),HostName VARCHAR(255), BlkBy VARCHAR(255),DBName VARCHAR(255), Command VARCHAR(255),CPUTime INT, DiskIO INT,LastBatch VARCHAR(255), ProgramName VARCHAR(255),SPID2 INT, REQUESTID INT) INSERT INTO #sp_who2 EXEC sp_who2 update s set blkBy = 'SRC' from #sp_who2 s join #sp_who2 t on s.spid = cast(t.blkby as integer) where s.blkby = ' .' and t.blkby <> ' .' SELECT s.SPID, s.HostName, BlkBy, p.login_time, p.waittime, s.status, Command, LastBatch, CPUTime, DiskIO, dm.text FROM #sp_who2 s join sys.sysprocesses p on (p.spid = s.spid) cross apply sys.dm_exec_sql_text(p.sql_handle) dm -- Add any filtering of the results here : WHERE DBName = 'SQL' and ProgramName='Microsoft Dynamics AX' AND BlkBy <> ' .' -- Add any sorting of the results here : ORDER BY blkBy DESC, LastBatch DESC DROP TABLE #sp_who2 Вопрос в чем: часто обращаются к программистам чтобы посмотрели блокировки на сервере, хочется сделать формочку в аксапте, которая бы запускала этот скрипт на sql сервере и получала результат, чтобы люди не заходя на sql сервер из под аксапты получали сведения о блокировках. Как считаете, вполне реализуемая задача? |
|
|
За это сообщение автора поблагодарили: Player1 (2). |
28.12.2018, 07:16 | #2 |
Administrator
|
Конечно реализуема.
Но для реализации потребуется: - дать права в SQL Server на выполнение скрипта пользователю, от имени которого запущен AOS (т.е. дать права ему на базу master, т.к. скрипт должен вызываться не в контексе БД АХ. Т.е. это что-то типа включить пользователя в роль sysadmin, но могу ошибаться и может удастся выдать права без включения в роль sysadmin. Однако всяко нужно побольше прав, чем просто db_owner на аксаптовую БД) - создать в АХ табличку, куда будет складироваться результат выборки. Табличка должна быть аксаптовой, т.е. с полем RecId и заполняться кодом из X++ - подумать над тем, чтобы обновление этой таблички двумя разными пользователями АХ - не привело бы к ошибкам / блокировкам
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
28.12.2018, 07:33 | #3 |
Участник
|
если я не ошибаюсь взаимодействие с SQL сервером идет через посредника - AOS-а, у которого и так все права есть на базу.
Предположим создам я эту табличку в AX, а как сделать так чтобы этот скрипт при вызове формы обновлял её результатами скрипта? |
|
28.12.2018, 07:44 | #4 |
Участник
|
Есть класс Connection который позволяет выполнять прямой sql http://erpkb.info/axapta/доступковнешнимбазам - там примеры с доступом к другим базам но можно так же и со своей.
Я бы сделал временную табличку и скидывал данные туда. |
|
28.12.2018, 08:20 | #5 |
Administrator
|
Цитата:
Он и не будет обновлять. Это будете делать Вы по кнопке "Обновить" (по аналогии с формой активных пользователей). А в коде по нажатию кнопки - потребуется написать код, который вызовет сей скрипт, построчно выберет данные (см класс Statement и метод executeQuery) и запишет в таблицу, которая будет уже отображаться на форме (т.е. сначала удалит все записи из таблицы, а затем добавит результаты отработки скрипта)
__________________
Возможно сделать все. Вопрос времени |
|
28.12.2018, 08:52 | #6 |
Участник
|
В АХ 4.0 имеется Администрирование/Запросы/База данных/Блокировки пользователей базы данных которая работает к сожалению лишь с SQL Server 2000, но быть может рассмотреть эту форму поближе и на ее основе и сделать желаемую форму со скриптом
|
|
28.12.2018, 08:53 | #7 |
Участник
|
А что вы собираетесь с этой информацией дальше делать? Или вы потом захотите кнопочку и чтобы пользователи ее тыкали?
|
|
|
За это сообщение автора поблагодарили: trud (2), sukhanchik (3). |
28.12.2018, 10:18 | #8 |
Участник
|
Насколько я помню, мы в свое время заставили её работать из DAX4 и с 2008 сервером. Если правильно помню, обращения там идут к объектам, которые считаются устаревшими, поэтому просто так недоступны и требовалось давать какие-то расширенные права.
|
|
28.12.2018, 11:01 | #9 |
Участник
|
Реализуема.
Есть пакетный класс, подходит и для 4 и для 2009 версии. Запускаем, крутится по расписанию и высылает заинтересованным лицам письмо о наличии блокировок. Могу поднять из архива и завтра (29/12) выложить, если есть потребность. |
|
|
За это сообщение автора поблагодарили: CHESER85 (1). |
28.12.2018, 11:53 | #10 |
Участник
|
было бы супер))) заранее спасибо!
|
|
16.01.2019, 11:10 | #11 |
Участник
|
Возможно ли обойтись без выдачи доп. прав AOS? Может есть возможность сделать запрос под правами другого пользователя?
|
|
16.01.2019, 13:28 | #12 |
Administrator
|
Ну вот по ссылке - есть класс ODBCConnection и UserConnection. ODBCConnection позволяет подключиться под другим пользователем (см пример по ссылке).
UserConnection позволяет не заниматься авторизацией и выполнять все от имени текущего пользователя. Цитата:
Сообщение от belugin
Есть класс Connection который позволяет выполнять прямой sql http://erpkb.info/axapta/доступковнешнимбазам - там примеры с доступом к другим базам но можно так же и со своей.
Я бы сделал временную табличку и скидывал данные туда. Т.е. решать вопрос прав надо на уровне АХ, а не SQL
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: YoungPadawan (1). |
16.01.2019, 16:19 | #13 |
Участник
|
Цитата:
Сообщение от sukhanchik
Ну вот по ссылке - есть класс ODBCConnection и UserConnection. ODBCConnection позволяет подключиться под другим пользователем (см пример по ссылке).
UserConnection позволяет не заниматься авторизацией и выполнять все от имени текущего пользователя. В таком виде вполне возможно решить исходную задачу. Т.е. решать вопрос прав надо на уровне АХ, а не SQL |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
16.01.2019, 16:47 | #14 |
Administrator
|
Тут вопрос в версии. Причем как версии АХ, так и SQL Server В 4.0 (как спрашивал автор ветки) методы были и ими можно было пользоваться. В 2009-й был готов пример по ссылке. В 2012-й возможно подключение стало работать только через строку подключения. Возможно, это особенность конкретной версии SQL Server - тут не подскажу. Главное - что решение найдено.
__________________
Возможно сделать все. Вопрос времени |
|
17.01.2019, 00:16 | #15 |
Участник
|
sp_whoisactive
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), YoungPadawan (1). |
22.01.2019, 14:56 | #16 |
Участник
|
Цитата:
Сообщение от YoungPadawan
Спасибо. Нужно было просто лучше погуглить. Я не увидел методов setUser() и setPassword() в классе LoginProperty и подумал что в АХ2009 эту возможность убрали. А на самом деле строка подключения формируется по другому https://community.dynamics.com/ax/f/33/t/146719
|
|
22.01.2019, 15:32 | #17 |
Участник
|
Цитата:
Мы можем и с пользователем SQL подключаться, устанавливая строку подключения методом setOther, например, так: X++: advParms = 'DRIVER=SQL Server' + '; DATABASE=' + _database + '; SERVER=' + _server + (_port ? ',' + _port : '') + '; UID=' + _userId + '; PWD=' + _password; loginProperty .setOther(advParms); |
|
24.01.2019, 10:37 | #18 |
Участник
|
Цитата:
Сообщение от Raven Melancholic
Не обязательно.
Мы можем и с пользователем SQL подключаться, устанавливая строку подключения методом setOther, например, так: X++: advParms = 'DRIVER=SQL Server' + '; DATABASE=' + _database + '; SERVER=' + _server + (_port ? ',' + _port : '') + '; UID=' + _userId + '; PWD=' + _password; loginProperty .setOther(advParms); Или Вы ответили это к тому что можно использовать ODBCConnection + LoginProperty для подключения НЕ под текущим пользователем, а не использовать CCADOConnection? А пользователя SQL нужно создавать в любом случае? |
|
|
|