SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.09.2009 09:38:40

BlackFalcon
Участник
Зарегистрирован: 24.09.2009
Сообщений: 4

Помогите составить грамотный запрос.

Задача:
Экспортировать данные из LDAP каталога в MySQL базу данных посредством powershell.

Входные данные:
1. Скрипт для подключения к базе данных Mysql через который можно отослать любую команду. Вот как он выглядит:

[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")

# Open Connection
$connStr = "server=127.0.0.1;port=3306;uid=root;pwd=password;database=test;Pooling=False"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()

# Create a MySqlCommand and MySqlDataAdapter object
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand("SHOW TABLES", $conn)
$da = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)

Дальше можно делать всё, что угодно, например показать результат:
# Populate a dataset and output the query result
$ds = New-Object System.Data.DataSet
$da.Fill($ds) > $null
$result = $ds.Tables[0]
$result | Format-Table *

2. Данные, полученные из Active Directory в некую переменную, $ad_users. Это таблица, содержащая все данные по всем пользователям из active directory.  Вот одна строка этой таблицы экспортированная в формат CSV (чтобы Вы имели представление о полях). Первыми идут поля. Потом одна строка с данными.

"objectsid","objectclass","objectguid","sn","adspath","whencreated","whenchanged","givenname","l","facsimileTelephoneNumber","mail","mobile","physicalDeliveryOfficeName","telephoneNumber","st","wWWHomePage","City","Company","Department","Email","Fax","FirstName","HomePhone","Initials","LastName","LogonName","Manager","MobilePhone","Office","Pager","PhoneNumber","PostalCode","PostOfficeBox","PrimaryGroupId","StateOrProvince","StreetAddress","Title","WebPage","HomeDirectory","HomeDrive","ProfilePath","LogonScript","UserPrincipalName","TsProfilePath","TsHomeDirectory","TsHomeDrive","TsAllowLogon","TsRemoteControl","TsMaxDisconnectionTime","TsMaxConnectionTime","TsMaxIdleTime","TsReconnectionAction","TsBrokenConnectionAction","TsConnectClientDrives","TsConnectPrinterDrives","TsDefaultToMainPrinter","TsWorkDirectory","TsInitialProgram","AccountExpires","PasswordLastSet","PasswordAge","PasswordExpires","LastLogonTimestamp","LastLogon","LastLogoff","AccountIsDisabled","AccountIsLockedOut","PasswordNeverExpires","UserMustChangePassword","AccountIsExpired","PasswordIsExpired","AccountExpirationStatus","PasswordStatus","NTAccountName","SamAccountName","Security","Domain","LastKnownParent","MemberOf","NestedMemberOf","Notes","AllMemberOf","Path","DN","CanonicalName","CreationDate","ModificationDate","ParentContainer","ParentContainerDN","Name","ClassName","Type","Guid","Sid","Description","DisplayName","Cache","Connection","DirectoryEntry"


"01050000000000051500000079E3FC53EB25792C16C0EA3266080000","System.Object[]","19ECE7E03A8DB4429116A1B117C91C1A","Галеев","LDAP://rarus.alyans.local/CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","05.01.2006 13:39:20","19.01.2009 16:00:57","Рустам",,,,,,,,,,,,,,"Рустам",,,"Галеев","grh",,,,,,,,"513",,,,,,,,"admin.bat","grh@alyans.local",,,,"True","EnableInputNotify","00:00:00","00:00:00","00:00:00","AnyComputer","Disconnect","True","True","True",,,,"06.11.2007 11:55:45","687.03:48:22.1020299",,"29.10.2007 9:00:24","29.10.2007 11:41:50",,"True","False","True","False","False","False","Never","Password never expires","OFFICE\grh","grh","Quest.ActiveRoles.ArsPowerShellSnapIn.UI.SecurityDescriptor","OFFICE\",,"System.String[]","System.String[]",,"System.String[]","LDAP://rarus.alyans.local/CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","alyans.local/office/Уволенные/Галеев Рустам","05.01.2006 13:39:20","19.01.2009 16:00:57","alyans.local/office/Уволенные","OU=Уволенные,OU=office,DC=alyans,DC=local","Галеев Рустам","user","user","e0e7ec19-8d3a-42b4-9116-a1b117c91c1a","S-1-5-21-1409082233-746137067-854245398-2150",,"Галеев Рустам","Quest.ActiveRoles.ArsPowerShellSnapIn.BusinessLogic.ObjectCache","Quest.ActiveRoles.ArsPowerShellSnapIn.Data.ArsADConnection","System.DirectoryServices.DirectoryEntry"



И наконец - задачка: Экспорт из этой переменной в MySQL ВСЕХ ДАННЫХ. Вот тут моя фантазия из за отсутствий знаний по MySQL даёт сбой. Прошу пнуть в правильном направлении.

Отредактированно BlackFalcon (24.09.2009 09:48:27)

Неактивен

 

#2 24.09.2009 13:54:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить грамотный запрос.

LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV

Неактивен

 

#3 24.09.2009 14:32:51

BlackFalcon
Участник
Зарегистрирован: 24.09.2009
Сообщений: 4

Re: Помогите составить грамотный запрос.

paulus написал:

LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV

В принципе - эта идея меня уже посещала. Экcпортнуть в CSV, затем импортировать в MySQL по pipe... В принципе - решение. Попробую.

Хотелось бы еще что-нибудь умное попробовать :-)

Неактивен

 

#4 24.09.2009 15:07:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить грамотный запрос.

Если задача в «потренироваться написать что-нибудь», то разбейте сначала по строкам,
потом по запятым, сформируйте соответствующие запросы, и выполните их в базе smile

Неактивен

 

#5 25.09.2009 09:39:26

BlackFalcon
Участник
Зарегистрирован: 24.09.2009
Сообщений: 4

Re: Помогите составить грамотный запрос.

paulus написал:

LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV

Окей, натравил.

Всё нормально. Почти. Вот запрос:

LOAD DATA LOCAL INFILE 'ADUsers.csv'
INTO TABLE ad_users
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
IGNORE 2 LINES;

Всё отлично, до того момента, как в записях попадаеться знак '\', который, похоже, интерпретируется как некая последовательность. Результат поражает:

Запись OFFICE\bochkov в таблице выглядит как OFFICEochkov (а посерёдке какой-то неотображаемый знак...)

Ну и в конце строки сбой импорта, там запись типа "Quest.ActiveRoles.ArsPowerShellSnapIn.UI.SecurityDescriptor","OFFICE\",,"System.String[]", где кавычка идущая за '\' не воспринимается, и соответсвенно поле заканчивается не там, где нужно.

Подскажите, как побороть это досадное недоразумение...

Отредактированно BlackFalcon (25.09.2009 09:45:41)

Неактивен

 

#6 25.09.2009 15:14:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить грамотный запрос.

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

Альтернативно, можете сначала пройтись по этому файлику и заменить там,
где нужно, символы \ на \\ — тогда MySQL будет интерпретировать их как
один правильный символ.

Неактивен

 

#7 29.09.2009 08:32:46

BlackFalcon
Участник
Зарегистрирован: 24.09.2009
Сообщений: 4

Re: Помогите составить грамотный запрос.

big_smile Yes! Всё работает.
Спасибо Вам большое за дельный и грамотный совет.
Тему можно закрывать smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson