- PVSM.RU - https://www.pvsm.ru -
Иногда у системных инженеров возникает необходимость получить определенный набор данных непосредственно из самой СУБД средствами Powershell. В данной статье хочу продемонстрировать два метода работы c firebird, postgresql через odbc драйвер и клиентскую библиотеку.
Начнем с firebird и работу с базой через ODBC драйвер, для начала нужно зарегистрировать в системе клиентскую библиотеку GDS32.DLL, ее разрядность должна быть такой же как и ODBC драйвера который должен быть установлен далее, скачать можно на сайте производителя [1], обязательно во время установки необходимо поставить галочку о регистрации библиотеки.
Далее устанавливаем сам ODBC, который также берем на сайте производителя [2], не забываем что его разрядность должна соответствовать разрядности ранее установленного клиента. Теперь собственно сам powershell скрипт, за его основу был взят пример на C# для postgresql. [3]
$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
}
Логика работы с базой:
В конце скрипта обычным циклом foreach, идет перебор полученных данных, здесь возможно дописать собственную логику, к примеру создать почтовый ящик согласно логина, или добавить пользователя в определенную группу.
Теперь рассмотрим способ с использованием клиентской библиотеки, он не требует установки ODBC драйвера и регистрации клиентской библиотеки в системе. Скрипт основан на примерах [4] для 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 драйвера. Сначала необходимо его [5] установить, я использовал упакованный в 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
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/powershell/202604
Ссылки в тексте:
[1] скачать можно на сайте производителя: http://firebirdsql.org/en/firebird-2-5-1/
[2] который также берем на сайте производителя: http://firebirdsql.org/en/odbc-driver/
[3] пример на C# для postgresql.: https://odbc.postgresql.org/howto-csharp.html
[4] примерах: http://firebirdsql.org/en/net-examples-of-use/
[5] его: https://www.postgresql.org/ftp/odbc/versions/
[6] Источник: https://habrahabr.ru/post/313464/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.