Иногда у системных инженеров возникает необходимость получить определенный набор данных непосредственно из самой СУБД средствами Powershell. В данной статье хочу продемонстрировать два метода работы c firebird, postgresql через odbc драйвер и клиентскую библиотеку.
Начнем с firebird и работу с базой через ODBC драйвер, для начала нужно зарегистрировать в системе клиентскую библиотеку GDS32.DLL, ее разрядность должна быть такой же как и ODBC драйвера который должен быть установлен далее, скачать можно на сайте производителя, обязательно во время установки необходимо поставить галочку о регистрации библиотеки.
Далее устанавливаем сам ODBC, который также берем на сайте производителя, не забываем что его разрядность должна соответствовать разрядности ранее установленного клиента. Теперь собственно сам powershell скрипт, за его основу был взят пример на C# для postgresql.
$dbServerName = "localhost:base.gdb"
$dbUser = "SYSDBA"
$dbPass = "masterkey"
[string]$szConnect = "Driver={Firebird/InterBase(r) driver};Dbname=$dbServerName;Pwd=$dbPass;CHARSET=WIN1251;UID=$dbUser"
$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
$dsDB = New-Object System.Data.DataSet
try
{
$cnDB.Open()
$adDB = New-Object System.Data.Odbc.OdbcDataAdapter
$adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("Select * From users", $cnDB)
$adDB.Fill($dsDB)
$cnDB.Close()
}
catch [System.Data.Odbc.OdbcException]
{
$_.Exception
$_.Exception.Message
$_.Exception.ItemName
}
foreach ($row in $dsDB[0].Tables[0].Rows)
{
$row
}
Логика работы с базой:
- Открываем подключение к базе.
- Создаем Data Adapter, которые используются для заполнения DataSet.
- Заполняем свойство SelectCommand (Возвращает или задает инструкцию SQL или хранимую процедуру, используемую для выбора записей в источнике данных.), для этого создаем новый объект OdbcCommand и его конструктору передаем в виде строки наш запрос, также передаем ссылку на объект нашего открытого подключения.
- Заполняем наш DataSet полученным результатом выполненного запроса.
- Закрываем подключение к базе.
В конце скрипта обычным циклом foreach, идет перебор полученных данных, здесь возможно дописать собственную логику, к примеру создать почтовый ящик согласно логина, или добавить пользователя в определенную группу.
Теперь рассмотрим способ с использованием клиентской библиотеки, он не требует установки ODBC драйвера и регистрации клиентской библиотеки в системе. Скрипт основан на примерах для C#, доступны на сайте производителя.
function SelestFireBirdDB ($string)
{
[Reflection.Assembly]::LoadFile("C:filesdllFirebirdSql.Data.FirebirdClient.dll")
$TestLog = "D:tmpTestLog.txt"
#Строка подключения
$connectionString = "User=SYSDBA;Password=masterkey;Database=base.gdb;DataSource=localhost;Dialect=1;Pooling=true;MaxPoolSize=3;Connection Lifetime=60"
$connection= New-Object FirebirdSql.Data.FirebirdClient.FbConnection($connectionString)
try
{
$connection.Open()
}
catch
{
$_.Exception
$_.Exception.Message
$_.Exception.ItemName
}
#Транзакция
$Transaction = New-Object FirebirdSql.Data.FirebirdClient.FbTransactionOptions
$BeginTransaction = $connection.BeginTransaction($Transaction)
#Создаем запрос
$Command= New-Object FirebirdSql.Data.FirebirdClient.FbCommand($string,$connection,$BeginTransaction)
$Command.Parameters.Clear
$Command.Parameters.AddWithValue("Speed", 100)
#Создаем адаптер данных
$FbDataAdapter= New-Object FirebirdSql.Data.FirebirdClient.FbDataAdapter($Command)
$FbDataAdapter
$DataSet= New-Object System.Data.DataSet
try
{
$FbDataAdapter.Fill($DataSet)
$Selest= $DataSet.Tables[0]
}
catch
{
$_.Exception
$_.Exception.Message
$_.Exception.ItemName
}
finally
{
$BeginTransaction.Rollback()
$connection.Close()
}
return ,$Selest
}
Завершаю статью примером для postgresql, с использованием ODBC драйвера. Сначала необходимо его установить, я использовал упакованный в msi пакет, поскольку его удобно распространять средствами SCCM. Собственно сам скрипт, он отличается от firebird только строкой подключения, в которой меняется название драйвера. В windows 10 и windows server 2016 появился командлет, который покажет список зарегистрированных ODBC драйверов Get-OdbcDrive.
$dbServer = "192.168.0.10"
$dbName = "core"
$dbUser = "postgres"
$dbPass = "postgres"
$port = "5432"
[string]$szConnect = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
$dsDB = New-Object System.Data.DataSet
try
{
$cnDB.Open()
$adDB = New-Object System.Data.Odbc.OdbcDataAdapter
$adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("SELECT id, name, age, login FROM public.users" , $cnDB)
$adDB.Fill($dsDB)
$cnDB.Close()
}
catch [System.Data.Odbc.OdbcException]
{
$_.Exception
$_.Exception.Message
$_.Exception.ItemName
}
foreach ($row in $dsDB[0].Tables[0].Rows)
{
$row.login
$row.age
}
Надеюсь данная статья будет полезной, спасибо за внимание.
Автор: Didenko_G