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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.12.2018, 06:50   #1  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 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  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Конечно реализуема.
Но для реализации потребуется:
- дать права в SQL Server на выполнение скрипта пользователю, от имени которого запущен AOS (т.е. дать права ему на базу master, т.к. скрипт должен вызываться не в контексе БД АХ. Т.е. это что-то типа включить пользователя в роль sysadmin, но могу ошибаться и может удастся выдать права без включения в роль sysadmin. Однако всяко нужно побольше прав, чем просто db_owner на аксаптовую БД)
- создать в АХ табличку, куда будет складироваться результат выборки. Табличка должна быть аксаптовой, т.е. с полем RecId и заполняться кодом из X++
- подумать над тем, чтобы обновление этой таблички двумя разными пользователями АХ - не привело бы к ошибкам / блокировкам
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 28.12.2018, 07:33   #3  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
если я не ошибаюсь взаимодействие с SQL сервером идет через посредника - AOS-а, у которого и так все права есть на базу.
Предположим создам я эту табличку в AX, а как сделать так чтобы этот скрипт при вызове формы обновлял её результатами скрипта?
Старый 28.12.2018, 07:44   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Есть класс Connection который позволяет выполнять прямой sql http://erpkb.info/axapta/доступковнешнимбазам - там примеры с доступом к другим базам но можно так же и со своей.

Я бы сделал временную табличку и скидывал данные туда.
Старый 28.12.2018, 08:20   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
если я не ошибаюсь взаимодействие с SQL сервером идет через посредника - AOS-а, у которого и так все права есть на базу.
Верно, права есть... конкретно на базу AX, но для АХ этого достаточно. Но в Вашем скрипте идет обращение к объектам sys.sysprocesses, sys.dm_exec_sql_text - а их нет в базе АХ. Зато они есть в базе master. Поэтому Вам нужно дать AOS-у дополнительные права на обращение к этим объектам.

Цитата:
Сообщение от CHESER85 Посмотреть сообщение
Предположим создам я эту табличку в AX, а как сделать так чтобы этот скрипт при вызове формы обновлял её результатами скрипта?
Он и не будет обновлять. Это будете делать Вы по кнопке "Обновить" (по аналогии с формой активных пользователей). А в коде по нажатию кнопки - потребуется написать код, который вызовет сей скрипт, построчно выберет данные (см класс Statement и метод executeQuery) и запишет в таблицу, которая будет уже отображаться на форме (т.е. сначала удалит все записи из таблицы, а затем добавит результаты отработки скрипта)
__________________
Возможно сделать все. Вопрос времени
Старый 28.12.2018, 08:52   #6  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
В АХ 4.0 имеется Администрирование/Запросы/База данных/Блокировки пользователей базы данных которая работает к сожалению лишь с SQL Server 2000, но быть может рассмотреть эту форму поближе и на ее основе и сделать желаемую форму со скриптом
Старый 28.12.2018, 08:53   #7  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
А что вы собираетесь с этой информацией дальше делать? Или вы потом захотите кнопочку и чтобы пользователи ее тыкали?
За это сообщение автора поблагодарили: trud (2), sukhanchik (3).
Старый 28.12.2018, 10:18   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Player1 Посмотреть сообщение
В АХ 4.0 имеется Администрирование/Запросы/База данных/Блокировки пользователей базы данных которая работает к сожалению лишь с SQL Server 2000, но быть может рассмотреть эту форму поближе и на ее основе и сделать желаемую форму со скриптом
Насколько я помню, мы в свое время заставили её работать из DAX4 и с 2008 сервером. Если правильно помню, обращения там идут к объектам, которые считаются устаревшими, поэтому просто так недоступны и требовалось давать какие-то расширенные права.
Старый 28.12.2018, 11:01   #9  
NetBus is offline
NetBus
Участник
 
200 / 85 (3) ++++
Регистрация: 08.07.2005
Адрес: Москва
Реализуема.
Есть пакетный класс, подходит и для 4 и для 2009 версии.
Запускаем, крутится по расписанию и высылает заинтересованным лицам письмо о наличии блокировок. Могу поднять из архива и завтра (29/12) выложить, если есть потребность.
За это сообщение автора поблагодарили: CHESER85 (1).
Старый 28.12.2018, 11:53   #10  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
было бы супер))) заранее спасибо!
Старый 16.01.2019, 11:10   #11  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Но в Вашем скрипте идет обращение к объектам sys.sysprocesses, sys.dm_exec_sql_text - а их нет в базе АХ. Зато они есть в базе master. Поэтому Вам нужно дать AOS-у дополнительные права на обращение к этим объектам.
Возможно ли обойтись без выдачи доп. прав AOS? Может есть возможность сделать запрос под правами другого пользователя?
Старый 16.01.2019, 13:28   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Ну вот по ссылке - есть класс ODBCConnection и UserConnection. ODBCConnection позволяет подключиться под другим пользователем (см пример по ссылке).
UserConnection позволяет не заниматься авторизацией и выполнять все от имени текущего пользователя.

Цитата:
Сообщение от belugin Посмотреть сообщение
Есть класс Connection который позволяет выполнять прямой sql http://erpkb.info/axapta/доступковнешнимбазам - там примеры с доступом к другим базам но можно так же и со своей.

Я бы сделал временную табличку и скидывал данные туда.
В таком виде вполне возможно решить исходную задачу.
Т.е. решать вопрос прав надо на уровне АХ, а не SQL
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: YoungPadawan (1).
Старый 16.01.2019, 16:19   #13  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Ну вот по ссылке - есть класс ODBCConnection и UserConnection. ODBCConnection позволяет подключиться под другим пользователем (см пример по ссылке).
UserConnection позволяет не заниматься авторизацией и выполнять все от имени текущего пользователя.



В таком виде вполне возможно решить исходную задачу.
Т.е. решать вопрос прав надо на уровне АХ, а не SQL
Спасибо. Нужно было просто лучше погуглить. Я не увидел методов setUser() и setPassword() в классе LoginProperty и подумал что в АХ2009 эту возможность убрали. А на самом деле строка подключения формируется по другому https://community.dynamics.com/ax/f/33/t/146719
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 16.01.2019, 16:47   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,318 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Тут вопрос в версии. Причем как версии АХ, так и SQL Server В 4.0 (как спрашивал автор ветки) методы были и ими можно было пользоваться. В 2009-й был готов пример по ссылке. В 2012-й возможно подключение стало работать только через строку подключения. Возможно, это особенность конкретной версии SQL Server - тут не подскажу. Главное - что решение найдено.
__________________
Возможно сделать все. Вопрос времени
Старый 17.01.2019, 00:16   #15  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от CHESER85 Посмотреть сообщение
Имеется очень полезный скрипт на SQL сервере, который отображает блокировки.
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 is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Цитата:
Сообщение от YoungPadawan Посмотреть сообщение
Спасибо. Нужно было просто лучше погуглить. Я не увидел методов setUser() и setPassword() в классе LoginProperty и подумал что в АХ2009 эту возможность убрали. А на самом деле строка подключения формируется по другому https://community.dynamics.com/ax/f/33/t/146719
Дополню свой ответ. Пользователь на сервере должен быть с проверкой подлинности SQL Server, а не Windows. Может кому-то это очевидно, а я не этом застопорился
Старый 22.01.2019, 15:32   #17  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от YoungPadawan Посмотреть сообщение
Дополню свой ответ. Пользователь на сервере должен быть с проверкой подлинности SQL Server, а не Windows. Может кому-то это очевидно, а я не этом застопорился
Не обязательно.
Мы можем и с пользователем 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  
YoungPadawan is offline
YoungPadawan
Участник
 
21 / 23 (1) +++
Регистрация: 04.01.2017
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Не обязательно.
Мы можем и с пользователем SQL подключаться, устанавливая строку подключения методом setOther, например, так:
X++:
advParms    = 'DRIVER=SQL Server'
                        + '; DATABASE=' + _database
                        + '; SERVER='   + _server + (_port ? ',' + _port : '')
                        + '; UID='      + _userId
                        + '; PWD='      + _password;

loginProperty .setOther(advParms);
А разве я так и не написал что пользователь должен быть SQL, а не Windows?
Или Вы ответили это к тому что можно использовать ODBCConnection + LoginProperty для подключения НЕ под текущим пользователем, а не использовать CCADOConnection?
А пользователя SQL нужно создавать в любом случае?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axforum blogs: Квест: Подружим Dynamics Ax 2009 Sp1 RU7 c SharePoint Foundation 2010 Blog bot DAX Blogs 4 16.10.2017 17:50
emeadaxsupport: AX Performance Troubleshooting Checklist Part 1A [Introduction and SQL Configuration] Blog bot DAX Blogs 0 05.09.2014 21:11
ax-erp: Creating SSRS-Reports in Dynamics AX 2012 – What’s no longer possible in AX-reports Blog bot DAX Blogs 0 18.07.2012 12:11
gatesasbait: Dynamics AX 2009 SSRS and SSAS Integration Tips Blog bot DAX Blogs 3 09.07.2009 13:07
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05

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

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

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