Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
SELECT sAMAccountnamE, extensionAttribute7
  FROM OpenQuery(ADSI, '
SELECT sAMAccountname, extensionAttribute7
  FROM ''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''
 WHERE ObjectCategory=''Person'' AND
       MemberOf =''CN=YYY,OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru''')

(10 row(s) affected)


Как бы, как бы, как бы соорудить вот такое: (я понимаю, что так в лоб писать нельзя, но это для наглядности):

DECLARE C1 CURSOR FOR
 SELECT GROUP
   FROM dbo.ADGROUP

DECLARE C2 CURSOR FOR
 SELECT sAMAccountnamE, extensionAttribute7
   FROM OpenQuery(ADSI, 'SELECT sAMAccountname,extensionAttribute7
                           FROM ''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''
                          WHERE ObjectCategory = ''Person'' AND
                                MemberOf = ''CN='+@GROUP+',OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru''')

OPEN C1
 FETCH FROM C1 INTO @GROUP
 WHILE @@FETCH_STATUS = 0
  BEGIN
.............   


пробовал
@SQL='.............';

запутался где сколько надо кавычек
с этим LDAP// внутри ничего не получается
прошу помощи, братцы
19 окт 13, 11:11    [15001828]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
путь примерно такой:

create table #tmp (.............

insert into #tmp
exec('SELECT sAMAccountname,extensionAttribute7
FROM ''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''
WHERE ObjectCategory = ''Person''
AND MemberOf = 'CN='+@GROUP+',OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru'''
) AT ADSI;


select * from #tmp
19 окт 13, 11:47    [15001863]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
С кавычками все равно вам придется разобраться :-)
19 окт 13, 11:50    [15001866]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
спасибо! буду пробывать
с кявычками вроде разобрался
в шоке от их числа...

DECLARE @SQL VARCHAR(500)

SET @SQL = 'SELECT sAMAccountnamE, extensionAttribute7 FROM OpenQuery(ADSI, ''
SELECT sAMAccountname, extensionAttribute7
  FROM ''''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''''
 WHERE ObjectCategory=''''Person'''' AND MemberOf =''''CN=YYY,OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru'''''')'

EXEC(@SQL)

(10 row(s) affected)
19 окт 13, 11:56    [15001873]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
Я вам инструкцию подготовил с расчетом того, что вы вставлять будете в курсор (SELECT на выходе). Ваш вариант такого не предполагает (EXEC на выходе).
19 окт 13, 12:06    [15001895]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
ziktuw
Я вам инструкцию подготовил с расчетом того, что вы вставлять будете в курсор (SELECT на выходе). Ваш вариант такого не предполагает (EXEC на выходе).


Да не, эт понятно
У Вас кстати, перед CN одна штука кавычки, а надо две
19 окт 13, 12:17    [15001912]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
Интеерсно, а сразу в курсор это можно вставить:

Типа так:
DECLARE C2 CURSOR FOR
exec('SELECT sAMAccountname,extensionAttribute7
FROM ''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''
WHERE ObjectCategory = ''Person'' 
AND MemberOf = ''CN=' + @GROUP + ',OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru''') AT ADSI;
19 окт 13, 12:24    [15001919]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
ziktuw
путь примерно такой:

create table #tmp (.............

insert into #tmp
exec('SELECT sAMAccountname,extensionAttribute7
FROM ''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''
WHERE ObjectCategory = ''Person''
AND MemberOf = 'CN='+@GROUP+',OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru'''
) AT ADSI;

select * from #tmp

INSERT в таком виде не заработал

Msg 7411, Level 16, State 1, Line 9
Server 'ADSI' is not configured for RPC.
19 окт 13, 12:54    [15001958]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
Assoll
Guest
Assoll
INSERT в таком виде не заработал
Msg 7411, Level 16, State 1, Line 9
Server 'ADSI' is not configured for RPC.

А заработал так:

INSERT INTO #TMP
   EXEC('SELECT sAMAccountnamE, extensionAttribute7
              FROM OpenQuery(ADSI, ''SELECT sAMAccountname, extensionAttribute7
                                       FROM ''''LDAP:// OU=COMMON,OU=_Users,DC=XXX,DC=ru''''
                                      WHERE ObjectCategory=''''Person'''' AND
                                            MemberOf =''''CN=' + @AD_GROUP + ',OU=Common,OU=Applications,OU=_Groups,DC=XXX,DC=ru'''''')')

(10 row(s) affected)


БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ :)
19 окт 13, 13:04    [15001972]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
ziktuw
Member

Откуда:
Сообщений: 3553
Assoll
Msg 7411, Level 16, State 1, Line 9
Server 'ADSI' is not configured for RPC.


Это всего лишь нужно поставить галочку в настройках линкед-сервера ADSI
19 окт 13, 16:39    [15002361]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
правильно ли я понял, что табличную функцию с параметрами для чтения ADSI мне создать не удастся?
alter FUNCTION Get_group_members
(	
	@p_ldap     varchar(1000),
	@p_group_cn varchar(1000),
	@p_sam_name varchar(1000)
)
RETURNS TABLE 
AS
RETURN 
(
SELECT top 900 objectGUID, samaccountname, distinguishedName  
FROM OpenQuery (ADSI,
'
SELECT objectGUID, samaccountname, distinguishedName
FROM  ''' + @p_ldap + ''' 
where objectClass = ''user'' 
  and sAMAccountName = ''' + @p_sam_name + '*''
  and memberOf = ''' + @p_group_cn + '''  ')

)
GO
ругается на плюсы


Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64)
12 июл 19, 11:28    [21925572]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
andreymx,

инлайн нет, табличную можно
12 июл 19, 11:37    [21925582]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
TaPaK
andreymx,

инлайн нет, табличную можно
можешь пальцем ткнуть в разницу, я с терминами не очень
12 июл 19, 11:40    [21925587]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
TaPaK,

это?
-- ================================================
-- Template generated from Template Explorer using:
-- Create Multi-Statement Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> 
(
	-- Add the parameters for the function here
	<@param1, sysname, @p1> <data_type_for_param1, , int>, 
	<@param2, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS 
<@Table_Variable_Name, sysname, @Table_Var> TABLE 
(
	-- Add the column definitions for the TABLE variable here
	<Column_1, sysname, c1> <Data_Type_For_Column1, , int>, 
	<Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
AS
BEGIN
	-- Fill the table variable with the rows for your result set
	
	RETURN 
END
GO
12 июл 19, 11:40    [21925588]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
andreymx,

да
12 июл 19, 11:42    [21925592]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
TaPaK,

спасиб
12 июл 19, 12:00    [21925606]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
что-то не получается обойти все эти ограничения

alter FUNCTION Get_group_members_tmp
(
	@p_ldap     varchar(1000),
	@p_group_cn varchar(1000),
	@p_sam_name varchar(1000)
)
RETURNS 
@Users TABLE (sam_name varchar(1000))
AS
BEGIN
    declare
        @v_sql_text nvarchar(4000) = 
    '
    SELECT objectGUID, samaccountname, distinguishedName
    FROM  ''' + @p_ldap + ''' 
    where objectClass = ''user'' 
      and sAMAccountName = ''' + @p_sam_name + '*''
      and memberOf = ''' + @p_group_cn + '''  ';    

    INSERT into @Users
    exec('SELECT samaccountname
    FROM OpenQuery (ADSI, ' + @v_sql_text + ')'
    )


	
	RETURN 
END
GO

сообщение: 443, уровень: 16, состояние: 14, процедура: Get_group_members_tmp, строка: 20 [строка начала пакета: 20]
Invalid use of a side-effecting operator 'INSERT EXEC' within a function.
12 июл 19, 12:14    [21925618]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
andreymx,

недосмотрел, думаю такое не сложится
12 июл 19, 12:53    [21925654]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
andreymx
что-то не получается обойти все эти ограничения
И не получится.
CLR-функцию пишите.
12 июл 19, 12:58    [21925662]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
invm
andreymx
что-то не получается обойти все эти ограничения
И не получится.
CLR-функцию пишите.
пока процедуру написал
времянку заполняет
12 июл 19, 13:11    [21925673]     Ответить | Цитировать Сообщить модератору
 Re: Динамический OpenQuery в курсоре, выручайте  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52714
надо было вытянуть в БД членов групп (список групп из справочника, щаз таких групп около 1000)
написал две процедуры, одна рекурсивная, другая читает собственно АД

прим1: 35 тыщ строк вытянуло во времянку (группа, юзер) за 52 сек
прим2: есть группы, в которых кол-во юзеров > 900
12 июл 19, 13:50    [21925718]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить