Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
Я пытаюсь написать тригер, что бы на каждый "UPDATE event" SQL Server execute код который overwrite Active Directory Object.
У нас DB с юзерной информацией, и я хочу это информацию инсёрт в актив директори...
Кто-нибудь может подсказать где посмотреть на что-нибудь уже сделанное или направьте в привельном направлении

THX
21 апр 03, 20:17    [180517]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Через ADSI linked server у вас получится только просматривать информацию
Поэтому придется писать внешнюю программу/расширенную процедуру, которая и будет осуществлять нужные действия с Active Directory.
22 апр 03, 00:34    [180597]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
Ok. Если я не могу UPDATE из SQL, могу ли я запустить внешний скрипт по тригеру и передать какие-нибудь параметры на этот скрипт из SQL?
Идея такова, если я не могу UPDATE из самого SQL я хотел бы запускать VB скрипт и передавать на него ключевое поле, как параметр, с той целью, что бы VB скрипт производил SELECT, а затем UPDATE каждый раз когда рекорд обновляется. Таким образом я смог бы держать Актив Директори всегда в near-real-time состоянии...
Какие есть соображения по этому поводу?
24 апр 03, 01:14    [182726]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
exec master..xp_cmdshell 'blah-blah'
24 апр 03, 10:52    [182983]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
Спасибо за помощь, но я так и не могу придумать как передать параметр в коммандную строку.
Есть тригер - по UPDATE он запускает xp_cmdshell 'HR_update.vbs'
'HR_update.vbs' - выполняет SELECT and UPDATE, но, что SELECT - то???

Мне нужно как-то передать на HR_update.vbs параметр - ключевое поле

Что-то в роде:
xp_cmdshell 'HR_update.vbs %USER_SSNUM%' или что-то типа этого?
1 май 03, 01:58    [188971]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну вы хоть бы BOL открыли, посмотрели предложенные там примеры

DECLARE @cmd sysname, @var sysname

SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd
1 май 03, 15:28    [189093]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
My bad... :-) Sorry. I didn't see that one.
Thanks for help!
1 май 03, 17:44    [189129]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
DECLARE @cmd sysname, @var sysname
SET @var = '?????'
SET @cmd = 'wscript SQL2AD.vbs' + @var
EXEC master..xp_cmdshell @cmd, no_output

Ok, теперь у меня такой вопрос.
Как мне сделать переменную @var динамической

Как я уже описал, мне нужно update'нуть Active Directory с новой информацией, которая только что была добавлена в SQL.
Скажем 'Vasiliy Pupkin' поменял номер телефона. Как только UPDATE в таблице произошёл, и триггер сработал - Триггеру нужно всавить key гражданина 'Vasiliy Pupkin' в перемнную @var
Далее trigger вызовет мой скрипт SQL2AD.vbs с параметром @var (record key) и скрипт сделает "SELECT ID, First, Middle, Last, Phone, BlahBlah WHERE (ID = '" & @var & "' "

Всё что мне нужно - это динамически подставить переменную в вышеприведённый trigger.
Извеняюсь за столь разжёванный пример. Transact SQL не моя территория - я Network Administrator/VB/ASP person, SQL применяю только по нужде и от безисходности.
12 июл 03, 00:52    [259578]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Все пользовательские переменные в T-SQL - локальные. В триггер вы переменную не передатите.

Но насколько я понял ваши объяснений вам это и не нужно.
Во время выполнения триггера существуют две виртуальные таблицы - inserted и deleted - которые содержат записи таблицы, затронутые запросом, соответсвенно с новыми и старыми значениями.
12 июл 03, 21:09    [259811]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
All right.
Это интригующая info!
Can you point me to the right direction, on how to access that tables and operate with them. I don't even know where to approach 'help file' - what is the key-words? Maybe you know some samples or relevant/related question on this site or other sites?

Заранее спасибо за беспокрйство.
14 июл 03, 19:03    [261295]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да как использовать - почти также как и "обыкновенные" таблицы
SELECT * FROM inserted
Имена и типы полей совпадают с именами и типами полей основной таблицы.

DECLARE @cmd sysname, @var sysname
SELECT @var = ID FROM inserted
SET @cmd = 'wscript SQL2AD.vbs' + @var
EXEC master..xp_cmdshell @cmd, no_output

Только учтите, что триггера срабатывают на событие. Т.е. в inserted может быть больше одной записи.
14 июл 03, 19:41    [261332]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
kdmitry
Member

Откуда: St. Louis, MO USA
Сообщений: 25
Я что-то совсем запутался...
Перерыл тонну литературных опусов по SQL/T-SQL, и не в одном не нашёл достойного ответа про параметры таблицы INSERTED.
Насколько я понял, эта виртуальная таблица, которая образовывается после любого INSERT statement'а (Я assume that it will "live" all the way through the user session or till the next INSERT statement)
Вот код:

INSERT INTO Table01 (Field01) VALUES ('SomeRandomText')
GO
DECLARE @cmd sysname, @var sysname
SELECT @var = ID FROM inserted
SET @cmd = 'wscript SQL2AD.vbs' + @var
EXEC master..xp_cmdshell @cmd, no_output

А вот error result

(1 row(s) affected)

Server: Msg 208, Level 16, State 1, Line 2
Invalid object name 'inserted'.


What's wrong??? / Besides my personal ignorance :-) /
17 июл 03, 21:24    [266514]     Ответить | Цитировать Сообщить модератору
 Re: SQL to Active Directory (ADSI)  [new]
Glory
Member

Откуда:
Сообщений: 104760
которая образовывается после любого INSERT statement'а
Не после, а в процессе выполнения INSERT. А попасть "внутрь" insert-а можно с помощью триггера.

IF object_id('dbo.ti_table01') is not null and objectproperty(object_id('dbo.ti_table01'), 'IsTrigger') = 1

drop trigger dbo.ti_table01
go

create trigger dbo.ti_table01 on dbo.table01 for insert
as
DECLARE @cmd sysname, @var sysname
SELECT @var = ID FROM inserted
SET @cmd = 'wscript SQL2AD.vbs' + @var
EXEC master..xp_cmdshell @cmd, no_output
go

INSERT INTO Table01 (Field01) VALUES ('SomeRandomText')
go


Только учтите что inserted - это таблица, хоть и виртуальная. Поэтому в ней может быть больше одной записи

Перерыл тонну литературных опусов по SQL/T-SQL,
Про BooksOnline слышали ? Ставиться вместе с SQL, но можно и с microsoft.com скачать отдельно
17 июл 03, 21:38    [266523]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить