Не удалось подключиться к серверу базы данных. Как мне подключиться к базе данных, которая не находится на моем локальном хосте, с помощью PowerShell и встроенной безопасности?

Предыстория моего вопроса

В любой момент я ожидаю, что люди из службы безопасности в черных костюмах и черных солнцезащитных очках придут и заберут меня из-за всех моих попыток входа на сервер sql...

Я использовал и адаптировал пример iris classon для подключения к базе данных через PowerShell. В адаптированном коде используется Integrated Security=True"

$dataSource = my_enterprise_db_server
$database = my_db
$connectionString = "Server=$dataSource;Database=$database;Integrated Security=True;" 
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$table = new-object “System.Data.DataTable”
$query = "..."
$connection.Open()
$command = $connection.CreateCommand()
$command.CommandText  = $query
...

Хот-дог, который сработал. Спасибо Ирис.

Я прочитал способ snapin Import-Module sqlps для выполнения команды sql. Я также прочитал все ссылки, которые Майкл Соренс указал в своем ответе. Я могу смонтировать sqlserver, подключиться к mount mydb SQLSERVER SQLSERVER:\SQL, использовать ls или dir, пройти путь по объектам и т. д. Я также пересмотрел основную часть того, что Iris предоставила для

$table = Invoke-Sqlcmd –Server $dataSource –Database $database -Query $query

Эта версия Invoke-Sqlcmd позволяет мне подключаться к корпоративной базе данных. Проблема со всеми предоставленными ссылками заключается в том, что они предполагают, что вы будете работать с базой данных sqlexpress на локальном хосте. В тот момент, когда я пытаюсь использовать

Set-Location SQLSERVER:\SQL\my_enterprise_db_server\my_db

или подобные конструкции, я получаю сообщение, которое заканчивается на

... ПРЕДУПРЕЖДЕНИЕ. Не удалось получить информацию о службе SQL Server. Попытка подключиться к WMI на my_enterprise_db_server не удалась со следующей ошибкой: Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Я также видел упоминание о переменных окружения SQLCMDSERVER и SQLCMDDBNAME. Я установил их на

$env:SQLCMDDBNAME = "my_db"
$env:SQLCMDSERVER = "my_enterprise_db_server"
set-location sqlserver:\sql
ls

производит

MachineName                     
-----------                     
localhost   

Вопрос

Как правильно использовать set-location или New-PSDrive-Name для базы данных, которая не находится на моем локальном компьютере?


person Greg    schedule 18.12.2014    source источник
comment
Тебе обязательно? Возможно, у вас нет разрешений на локальный вход на этот сервер. ты там админ? Можно просто не указывать на него: $DataSource=ServerName\InstanceName   -  person Adil Hindistan    schedule 18.12.2014
comment
@AdilHindistan Грега нет ( 'admin', 'rdp', 'dba', 'etc'). Нет смысла иметь локальную базу данных. Должен ли я? Неа!. Ах, но проработав в среде Solaris/Linux 20 лет, а теперь работая в магазине MS, я вижу замечательную ценность псевдонима монтирования, который был применен к New-PSDrive-Name. Существует множество методов создания каталога, т. е. точки монтирования, а затем добавления других данных, а что нет. С помощью mount вы можете сократить путь только до таблиц. Следовательно, вы можете cd, ls и т. д. точно так же, как каталог или файл. Ознакомьтесь со статьей Майкла Соренса в вопросе выше.   -  person Greg    schedule 18.12.2014
comment
Вы пытаетесь управлять сервером или пытаетесь написать на нем код для БД? В первом случае вам потребуются права администратора на серверах для удаленного взаимодействия PowerShell/WMI. У разработчиков не будет прав администратора на серверах, где находятся рабочие БД, поэтому вы можете практически забыть о WMI (хотя технически он использует DCOM). То, что делает M.Soren, имеет смысл с точки зрения администратора баз данных или если вы управляете БД локально. Если вы разработчик, все, что вам нужно, это предоставить конн. string и делайте все, что вам нужно после этого, не требуя доступа к фактическому серверу, на котором находится БД.   -  person Adil Hindistan    schedule 18.12.2014
comment
@AdilHindistan Я считаю, что администраторы баз данных иногда оставляют себе слишком много хороших вещей. Как мало я могу использовать SSMS из-за политик безопасности, мне лучше использовать Oracle Sql Developer. Это сделало бы меня гораздо более эффективным при разработке запросов или использовании базы данных.   -  person Greg    schedule 19.12.2014


Ответы (1)


Я нашел ответ по счастливой случайности. Я щелкнул правой кнопкой мыши объект базы данных в студии управления сервером sql. Была возможность запустить powershell. Несмотря на то, что это похоже на параметр порядка sqlps, SSMS предоставила мне правильный способ установить местоположение.

Вариант 1. Если на сервере нет экземпляров, добавьте DEFAULT после server_name в косую черту пути.

Set-Location SQLSERVER:\SQL\server_name\DEFAULT\Databases\database_name\Tables\dbo.table_name

Вариант 2. Если у вас есть сервер с экземпляром, укажите имя экземпляра после server_name в косой черте пути.

Set-Location SQLSERVER:\SQL\server_name\instance_name\Databases\database_name\Tables\dbo.table_name

Я простой смертный в том, что касается безопасности баз данных. Многие функции SSMS для меня отключены из-за того, что мои параметры безопасности отличаются от того, как настроены параметры безопасности dba. Я постоянно получаю ошибки в SSMS. Ну, это ничем не отличается от Powershell, использующего Set-Location. Я не осознавал, что два сообщения об ошибках были связаны из-за конфигурации политики безопасности и ошибки пилота. Если я устанавливаю местоположение для таблицы, то у меня есть только два предупреждения об отказе в доступе. Если я установлю местоположение на уровне базы данных, то Powershell немного разнесет куски, но у меня есть настройка пути с косой чертой. Я не вижу ошибок, если использовал Invoke-SqlCmd. Теперь я понимаю, что то, как ошибки безопасности были представлены в Powershell, является причиной того, что я подумал, что проблема связана с тем, как я пытался подключиться к базе данных. Теперь я могу сделать это:

mount rb SELSERVER SQLSERVER:\SQL\server_name\DEFAULT\Databases\database_name\Tables
# Look at a list of tables.
ls
# Go to a traditional file system
cd F:\
# Go to the Linux Style mounted file system
cd rb:\
# Go to a table like a directory
cd dbo.my_table_name
# Look at the column names
ls
# Use relative navigation
cd ..\dbo.my_other_table_name
ls
# Compare column names with another table using relative navigation after I have just
# listed the current directory/table that I am in.
ls ..\dbo.my_table_name

Это просто потрясающе! Теперь все, что мне нужно сделать, это придумать массив имен серверов и баз данных, чтобы создать точки монтирования для всех баз данных, к которым я могу подключиться. Такой массив просто требует итерации для создания всех точек монтирования.

person Greg    schedule 18.12.2014