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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.07.2020, 21:42   #1  
oleggy is offline
oleggy
Участник
 
270 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
AX2009 возможно ли добавить пользователя в таб. UserInfo из SQL
Привет.
Подскажите возможно ли просто скопировать пользователей из одной базы в другую?
Это можно сделать в рамках SQL ?
Я так понял речь идет о таблице UserInfo.
Если через SQL невозможно создать пользователей то возможно ли в базе назначения через Job ?

Спрашиваю т.к. может быть не все так просто с добавлением пользователей..
Старый 15.07.2020, 08:00   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Через Job - пожалуйста. Только не забудьте еще пользователя включить в какую-нибудь группу прав, а то у него прав не будет.
Через SQL - тут есть общий нюанс, применимый к любой таблице в АХ в любой версии. Дело в том, что система при создании записи генерит значение поля RecId, которое должно быть уникально в пределах таблицы. В момент генерации система не смотрит на то, какие значения в таблице уже есть (работает некоторый внутренний счетчик), т.о. если Вы создадите запись внешними средствами, то потенциально есть риск того, что когда-то АХ захочет создать запись с Вашим значением RecId, а база данных не даст это сделать из-за уникального индекса.

Дальше будет тупик, потому что не создав запись - АХ не сдвинет счетчик, а следовательно без удаления Вашей записи - больше записей в систему не вставить.

Счетчики по каждой таблице по коду таблицы лежат в таблице SystemSequences. По идее - их надо там сдвигать (после модификации таблицы нужен рестарт АОСа), но надо обязательно проверять - помогло ли. В более ранних версиях даже существовали средства (класс SystemSequnces в System Documentation) внутри системы управления этими счетчиками, но на каком-то этапе они перестали работать (на каком - не помню)
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: oleggy (1).
Старый 15.07.2020, 08:03   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Я такой подход применял в назначениях групп прав. Из SQL назначал пользователю права, затем заходил в систему, их из системы удалял и заново создавал. Актуально было при разворачивании бекапа БД, в котором у меня не было прав для целей получения прав (предполагалось, что человеческим путем в силу ряда обстоятельств эта задача не решалась)
__________________
Возможно сделать все. Вопрос времени
Старый 15.07.2020, 11:22   #4  
oleggy is offline
oleggy
Участник
 
270 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Спасибо.
А вы не могли бы скинуть сюда пример такого джоба который создает нескольких пользователей и добавляет права. Или существующий джоб какой то, которым вы пользуетесь.

А так же если возможно как вы через SQL назначали пользователю права. Тоже интересно.
Старый 15.07.2020, 11:54   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от oleggy Посмотреть сообщение
Спасибо.
А вы не могли бы скинуть сюда пример такого джоба который создает нескольких пользователей и добавляет права. Или существующий джоб какой то, которым вы пользуетесь.

А так же если возможно как вы через SQL назначали пользователю права. Тоже интересно.
Эммм... вот не под рукой у меня AX2009. Писал пост по памяти. А в следующих версиях названия таблиц поменялись и немножко стало всё немножко по-другому
__________________
Возможно сделать все. Вопрос времени
Старый 16.07.2020, 15:26   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
В более ранних версиях даже существовали средства (класс SystemSequnces в System Documentation) внутри системы управления этими счетчиками, но на каком-то этапе они перестали работать (на каком - не помню)
Ух ты ж
Уже D730 появилась?)
Потому как в D365FO этот класс есть и активно используется в том числе в движке батчей
Не говоря уже о предыдущих версиях
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: sukhanchik (15).
Старый 16.07.2020, 16:42   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ух ты ж
Уже D730 появилась?)
Потому как в D365FO этот класс есть и активно используется в том числе в движке батчей
Не говоря уже о предыдущих версиях
Большое спасибо. Честное слово - не знал. В 2012 мне показалось, что этот класс похоронили, по крайней мере с т.з. работоспособности (но оставили в АОТе)
__________________
Возможно сделать все. Вопрос времени
Старый 16.07.2020, 19:44   #8  
astralsun is offline
astralsun
Участник
 
16 / 19 (1) ++
Регистрация: 17.04.2018
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Я такой подход применял в назначениях групп прав. Из SQL назначал пользователю права, затем заходил в систему, их из системы удалял и заново создавал. Актуально было при разворачивании бекапа БД, в котором у меня не было прав для целей получения прав (предполагалось, что человеческим путем в силу ряда обстоятельств эта задача не решалась)
если доменная авторизация, можно ещё свой SID админу подсунуть
Старый 16.07.2020, 19:51   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от oleggy Посмотреть сообщение
Привет.
Подскажите возможно ли просто скопировать пользователей из одной базы в другую?
Да, это возможно.
Цитата:
Сообщение от oleggy Посмотреть сообщение
Это можно сделать в рамках SQL ?
Да.
Цитата:
Сообщение от oleggy Посмотреть сообщение
Я так понял речь идет о таблице UserInfo.
Не только. Нужно учесть 3 таблицы: UserInfo, SysUserInfo и UserGroupList. Просмотрите их содержимое и поймете как, что и зачем.
Цитата:
Сообщение от oleggy Посмотреть сообщение
Если через SQL невозможно создать пользователей то возможно ли в базе назначения через Job ?
Оба способа вполне работоспособны. У нас DEV база копируется с PROD'а, соответственно, изначально там не предусмотрены разработчики. Запустив SQL-скрипт, мы создавали нужное количество записей с аккаунтами разработчиков автоматически.
Цитата:
Сообщение от oleggy Посмотреть сообщение
Спрашиваю т.к. может быть не все так просто с добавлением пользователей..
В основном есть 2 серьезные проблемы, это генерация RecId и извлечение SID пользователя в ActiveDirectory средствами SQL. Вторую проблему мы решили, захардкодив SID каждого разработчика. При копировании, проблем возникнуть не должно.
Цитата:
Сообщение от oleggy Посмотреть сообщение
Спасибо.
А вы не могли бы скинуть сюда пример такого джоба который создает нескольких пользователей и добавляет права. Или существующий джоб какой то, которым вы пользуетесь.
Просмотрите оборзевателем 3 таблицы, на которые я указал. Там нет ничего сложного, посмотрите также метод SysUserInfo.initValue().
Цитата:
Сообщение от oleggy Посмотреть сообщение
А так же если возможно как вы через SQL назначали пользователю права. Тоже интересно.
Легко, смотрите записи в таблице UserGroupList. Примеров приводить не буду, это довольно просто.

Приведу код генерации RecId, без которого может возникнуть зависон на недельку-другую в поисках решения.
PHP код:
CREATE PROCEDURE [dbo].[ppoGetRecId] (@TableId INT, @hop BIGINT, @RecId BIGINT OUTPUT)
AS
BEGIN

SET NOCOUNT ON

SET 
@RecId NULL

-- if record not exists
IF NOT EXISTS 
  
(SELECT FROM SYSTEMSEQUENCES
     WHERE DataAreaId 
'dat'
       
AND Id = -1
       
AND TabId = @TableId)
  
INSERT INTO SYSTEMSEQUENCES
    
(IDNEXTVALMINVALMAXVALCYCLENAMETABIDDATAAREAIDRECVERSIONRECID)
    
VALUES (-11192233720368547758070'SEQNO', @TableId'dat'1, -1)
-- 
end of if
  
UPDATE SYSTEMSEQUENCES
    SET 
@RecId    A.NextVal,
        
NextVal    A.NextVal + @HOP
FROM SYSTEMSEQUENCES A
WHERE A
.ID = -AND A.DATAAREAID 'dat' AND A.TABID = @TableId

SELECT ISNULL
(@RecId0) AS RecId

END 
P.S. Параметр @hop - это размер выделяемой порции, выделять RecId под несколько записей - обычное дело в AX.
__________________
// no comments

Последний раз редактировалось dech; 16.07.2020 в 19:59.
За это сообщение автора поблагодарили: sukhanchik (15).
Старый 16.07.2020, 23:27   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от oleggy Посмотреть сообщение
Подскажите возможно ли просто скопировать пользователей из одной базы в другую?
добавить пользователей в Аксапту можно и нужно при помощи startup-команд
https://axapta.mazzy.ru/lib/startupcmd_ax4/

по security-соображениям в публичной аксапте исключены startup-команды, которые добавляют пользователей, как и команды, которые меняют права пользователей.

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

Естественно, изнутри Аксапты можно обращаться к любым объектам аксапты. в том числе и к стандартным классам, которые добавляют пользователей.
а также изнутри Аксапты можно сделать и запрос к любому ODBC-источнику.

https://docs.microsoft.com/en-us/dyn...artup-commands
https://docs.microsoft.com/en-us/pre...868423(v=ax.50)
https://docs.microsoft.com/en-us/pre...870082(v=ax.50)
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 16.07.2020 в 23:47.
За это сообщение автора поблагодарили: oleggy (1).
Старый 17.07.2020, 20:50   #11  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Таки нашел у себя скрипт.
X++:
SET NOCOUNT ON

-- automatically add admins

DECLARE @RecId BIGINT
DECLARE @RecCount INT

CREATE TABLE #AdminUsers (
	Id NVARCHAR(5) NOT NULL,
	SecId NVARCHAR(124) NOT NULL,
	Alias NVARCHAR(20) NOT NULL,
	Name NVARCHAR(40) NOT NULL,
	Email NVARCHAR(80) NOT NULL,
	Domain NVARCHAR(255) NOT NULL DEFAULT 'your-domain.com'
)

CREATE NONCLUSTERED INDEX IX_ID
ON #AdminUsers (Id)

-- add admin users here:
INSERT INTO #AdminUsers VALUES ('Vasya', 'S-1-5-21-3902653788-3936360043-4268998436-25184', 'PupkinV', 'Pupkin, Vasily', 'vasily.pupkin@your-domain.com', DEFAULT)

SELECT @RecCount = COUNT(*) FROM #AdminUsers

-- UserInfo
EXEC ppoGetRecId 65531, @RecCount, @RecId OUTPUT
DELETE UserInfo WHERE Id IN (SELECT Id FROM #AdminUsers)
INSERT INTO UserInfo ([RecId], [Id], [Sid], [NetworkAlias], [NetworkDomain], [Company], [Enable], [Name], [Language], [HelpLanguage], [CompilerWarningLevel], [DebugInfo])
	SELECT ROW_NUMBER() OVER(ORDER BY Id) - 1 + @RecId, [Id], [SecId], [Alias], [Domain], 'clt', 1, [Name], 'EN-US', 'EN-US', 4, 16 FROM #AdminUsers

-- SysUserInfo
EXEC ppoGetRecId 956, @RecCount, @RecId OUTPUT
DELETE SysUserInfo WHERE Id IN (SELECT Id FROM #AdminUsers)
INSERT INTO SysUserInfo (RecId, Id, HelpTheme, DocuHandlingActive, DocuToolbarButtonActive, EventPollFrequency, EventPopUps, Email)
	SELECT ROW_NUMBER() OVER(ORDER BY Id) - 1 + @RecId, [Id], 'Dynamics', 1, 0, 15, 1, [Email] FROM #AdminUsers

-- UserGroupList
EXEC ppoGetRecId 65529, @RecCount, @RecId OUTPUT
DELETE UserGroupList WHERE UserId (SELECT Id FROM #AdminUsers)
INSERT INTO UserGroupList (RecId, UserId, GroupId)
	SELECT ROW_NUMBER() OVER(ORDER BY Id) - 1 + @RecId, [Id], 'Admin' FROM #AdminUsers

DROP TABLE #AdminUsers
__________________
// no comments
За это сообщение автора поблагодарили: oleggy (1).
Старый 22.07.2020, 07:10   #12  
oleggy is offline
oleggy
Участник
 
270 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от dech Посмотреть сообщение
Запустив SQL-скрипт, мы создавали нужное количество записей с аккаунтами разработчиков автоматически.

В основном есть 2 серьезные проблемы, это генерация RecId и извлечение SID пользователя в ActiveDirectory средствами SQL. Вторую проблему мы решили, захардкодив SID каждого разработчика. При копировании, проблем возникнуть не должно.
Так можно было просто копировать значение UserInfo.sid с прода в DEV.
Или у вас разрабы не имеют никакого доступа к проду? Даже учеток с заполненным sid пусть и выключенных?

Последний раз редактировалось oleggy; 22.07.2020 в 07:13.
Старый 30.07.2020, 18:54   #13  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от oleggy Посмотреть сообщение
Так можно было просто копировать значение UserInfo.sid с прода в DEV.
Или у вас разрабы не имеют никакого доступа к проду? Даже учеток с заполненным sid пусть и выключенных?
Нас в проде тупо нету. :-)
Наше дело работать в DEV-среде. Сидим на птичьих правах. :-)
__________________
// no comments
Старый 05.08.2020, 09:01   #14  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
145 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ух ты ж
Уже D730 появилась?)
Потому как в D365FO этот класс есть и активно используется в том числе в движке батчей
Не говоря уже о предыдущих версиях
Я знаю что начиная с AX7 (D365FO) генерировать RecId руками уже не надо. Достаточно просто вставить новую строку в таблицу и SQL сам заполнит RecId. Потому как в SQL это поле теперь SQL-ный number sequence.

Да сами проверьте!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как узнать имя пользователя Axapta на SQL? Didukh84 DAX: Программирование 36 06.02.2014 14:14
Ax2009 Установка расширен ср-в отчетности и SQL 2008 Arahnid DAX: Администрирование 10 29.08.2012 22:53
Ошибка при добавлении нового пользователя в AX2009 LexR DAX: Администрирование 4 06.07.2012 17:51
Завершение AOS-ом сессии пользователя при рестарте SQL сервера vesna dba DAX: Администрирование 1 13.06.2007 09:02
aEremenko: Диагностика проблем при установке Microsoft Dynamics Ax 4.0 на Microsoft SQL Server 2005 Blog bot DAX Blogs 0 28.10.2006 16:01

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

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

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