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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.02.2006, 12:45   #1  
Lukich is offline
Lukich
Участник
 
4 / 10 (1) +
Регистрация: 16.02.2006
Thumbs up
В системе Navision преобразование происходит через виртуальную таблицу "SID - Account ID":
Lookup("SID - Account ID".ID WHERE (SID=FIELD(Login SID)))
Как мне это преобразование сделать в T-SQL(или VBA)?

SID в Navision хранится в строке (Text(119)) вида "S-1-5-21-1715567821-1364589140-682003330-2941", в MSSQLServer'2000 - SID имеет двоичный тип (varbinary(85)) в HEX-формате вида "0x010500000000000515000000C6BB507AA33CD326828BA6282D050000"
Как их сопоставить?

Знатоки, помогите!
Старый 16.02.2006, 13:21   #2  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
А зачем их согласовывать?
Старый 16.02.2006, 13:33   #3  
Lukich is offline
Lukich
Участник
 
4 / 10 (1) +
Регистрация: 16.02.2006
Я не говорил "согласовывать".
Мне нужно через T-SQL (т.е. не в cистеме Navision) из таблицы "Windows Login" получить список пользоватей. Там же есть только поле SID в непонятном для меня формате. В этом и проблема.
Старый 16.02.2006, 14:28   #4  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
ааа... вот оно что
Старый 16.02.2006, 14:33   #5  
Lukich is offline
Lukich
Участник
 
4 / 10 (1) +
Регистрация: 16.02.2006
Спасибо, Fordewind!
Но я в первом посте указал что это поле "Windows Login".ID является вычисляемым Lookup("SID - Account ID".ID WHERE (SID=FIELD(Login SID))). А таблица "SID - Account ID" - виртуальная! Как мне до неё добраться в T-SQL?
Или как этот текстовый SID ПРАВИЛЬНО привести к двоичному виду?
Старый 17.02.2006, 16:39   #6  
Lukich is offline
Lukich
Участник
 
4 / 10 (1) +
Регистрация: 16.02.2006
SQL.RU помог
Решение:
Код:
create FUNCTION dbo.fnBinaryToInt
(@Bin varbinary(4))
RETURNS int
AS
	BEGIN
	if Len(@Bin)<4
		set @Bin=SUBSTRING(@Bin+0x00000000,1,4)
	RETURN CONVERT(int, Convert(binary(4), REVERSE(CONVERT(char(4), @Bin))))
	END
go

create function dbo.fnSIDToStrSID(@sid as varbinary(85))
returns varchar(119)
AS
BEGIN
--SET NOCOUNT ON
	declare @ssid varchar(119), @SAC tinyint,  @i as tinyint, @b4 as binary(4)
	
	set @ssid='S-'+LTRIM(STR(cast(SUBSTRING(@sid,1,1) as tinyint)))+'-'+LTRIM(cast(CONVERT(bigint, 0x0000+SUBSTRING(@sid,3,6)) as varchar(64)))
	set @SAC=cast(SUBSTRING(@sid,2,1) as tinyint)
	
	set @i=0
	while @i<@SAC begin
	  set @b4=SUBSTRING(@sid,@i*4+9,4)
	  set @ssid=@ssid+'-'+LTRIM(STR(dbo.fnBinaryToInt(@b4)))
	  set @i=@i+1
	end
	
	--select  master.dbo.fn_varbintohexstr(@sid) HexSID, @ssid StrSID
	return @ssid
END
 


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

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

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