SQL Server와 통신하려면 어떤 PowerShell 기술을 사용해야합니까?


29

궁극적으로 PowerShell을 사용하여 SQL 인스턴스 모니터에 사용하는 기존 KornShell 스크립트를 대체하고 싶습니다. 하지만 PowerShell에서 실제로 SQL Server와 통신 할 수있는 여러 가지 방법을 모두 이해하기가 어렵습니다. 이것이 전부인지 확실하지 않지만 SQL 서버 버전을 쿼리 할 수있는 완전히 다른 5 가지 방법이 있습니다.

1. SQLConnection .NET 클래스

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=MyServer;Database=Master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "Select @@version as SQLServerVersion"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

2. WMI 제공자

$sqlProperties = Get-WmiObject 
    -computerName "MyServer"
    -namespace root\Microsoft\SqlServer\ComputerManagement10
    -class SqlServiceAdvancedProperty
    -filter "ServiceName = 'MSSQLSERVER'"
$sqlProperties.VERSION

3. SMO

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$smo-var = New-Object ('Microsoft.SqlServer.Management.Smo.Server') 'MyServer\instancename'
$smo-var.VersionString

4. PSDrive

Set-Location SQLSERVER:\SQL\MyServerName\
$server = Get-Item Default
$server.get_VersionString()

5. Invoke-SQLCMD

Invoke-Sqlcmd -Query "SELECT @@version" -ServerInstance "MyServer"

다른 시나리오에 사용할 기술을 결정하려면 어떻게해야합니까? 각각의 장단점이 있습니까? 이 powershell 1.0 기술 중 일부가 2.0에서 대체 되었습니까? 그들 중 일부는 SQL 2000 또는 2005 서버와 통신 할 수 없습니까?

한 단계에서, 나는 대답이 "어떻게 든 사용하십시오"라고 확신하지만 Powershell을 처음 접하는 사람에게는 위의 # 1과 같이 많은 것들이 가장 길고 (내 생각에) 가장 적을 때 매우 혼란 스럽습니다. "powershell과 같은"예입니다.

관련이있는 경우 약간 더 많은 정보 : 실제로 모니터 스크립트를 실행하는 SQL Server는 SQL 2005이지만 SQL 2000에서 2008R2까지 여러 인스턴스에 연결하는 데 사용됩니다.


1
우선, 좋은 질문과 매우 철저합니다. +1. 아마이 목록을 ADO.NET (첫 번째 것)과 SMO 중 두 가지로 좁힐 것입니다. WMI는 약간 어색 할 수 있으며 키 입력이 적더라도 언뜻보기에는 "명확하지"않습니다.
Thomas Stringer

답변:


7

분명히,이 중 많은 부분이 단순한 개인 선택에 달려 있습니다. 여기 내 자신의 개인적 합리화가 있습니다.

PSH v 1.0 이후로 SQL SQL과 함께 Powershell을 사용하고 있으며 SQL Server가 공식 통합을 시작하기 전에. (PSH를 시작할 때 SQL Server 2000 및 2005 서버를 관리하고있었습니다.) 따라서 SMO (또는 이름이 약간 오래된 화신, 현재 이름에서 벗어날 수 있음)와 .Net에 대해 배웠습니다. 그들. 객체를 스크립팅하는 것과 같이 일부 작업이 훨씬 쉬워지기 때문에 일반적으로 SMO에 의존합니다. 내 코드는 SMO를 몇 번 사용하고 .Net을 몇 번 사용합니다. 예를 들어 .Net을 사용하여 간단한 결과 집합을 얻는 것이 더 편리하다고 생각합니다.

기존 TSQL 스크립트가 많으면 Invoke-SQLCMD가 더 적합하다고 생각합니다. 문자열을 만들고 -Query를 통해 문자열을 실행하면 지저분해질 것입니다. Powershell이 ​​.Net 및 SMO와 작동하는 방식을 잘 알고 있다면 Invoke-SQLCMD를 사용하여 스크립트 파일을 실행할 때 가끔 사용하기 쉽습니다.

나는 항상 PSDrive가 어수선한 것을 발견했으며 "모든 것이 파일 시스템처럼 보일 수있다"는 생각에 빠지기 때문에 그것을 구현했다고 느꼈다. 나는 * nix 녀석들이 \ proc 등을 좋아한다는 것을 알고 있지만,이 함침은 일종의 강제 감을 느낍니다. 나는 PSDrive가 괜찮다고 생각합니다 .UI를 싫어한다면 탐색하는 데 좋을 것입니다.하지만 그것을 사용하는 스크립트를 작성한 적이 없습니다.

누구도 WMI 공급자를 사용하는 것을 본 적이 없습니다. 그래서 그것이 나의 마지막 선택이 될 것입니다.

따라서 SMO를 이끌고 .Net을 사용하는 것이 좋습니다.


1
명심해야 Invoke-SQLCmd할 것은 연결을 매우 우아하게 처리하지 못한다는 것입니다. 별도의 쿼리가 많은 스크립트가있는 경우 연결이 유지 / 재사용되거나 삭제되지 않아 #TEMP테이블 지속 또는 리소스 문제와 같은 예기치 않은 문제가 발생할 수 있습니다 .
JNK

3

새로운 작업의 경우 4, 기존 스크립트 또는 작업장의 재사용을위한 5의 경우 T-SQL은 객체 기반 / 포쉬 스타일 코드보다 의미가 있습니다. 나는 그들이 명확하고 단순하기 때문에 가장 좋아합니다.


2

가능한 경우 SQLPS를 사용하는 경향이 있습니다. 더 간단하고 스크립트에서 사용하면 SMO를 사용하는 것보다 읽기 쉽고 타이핑이 훨씬 쉽습니다. SMO는 강력한 힘을 가지고 있다는 점을 가지고 있지만 익숙하지 않은 경우 사용하기가 때때로 혼란 스러울 수 있습니다.

SQL Server 버전이 출시되면 SQLPS가 향상 될 것이라고 생각합니다. 특히 SQL Server 2012에서는 SQLPS가 스냅인 대신 모듈식이 아닙니다. 이를 통해 Microsoft는 서비스 팩이나 핫픽스, 심지어 CU를 통해 SQLPS의 수정 사항이나 개선 사항을 푸시 할 수 있습니다.

그런 다음 SQLPSX 와 같은 커뮤니티 오퍼링도 있습니다.이 오퍼링 에는 이미 cmdlet 및 함수로 준비된 SMO 코드가 많이 있습니다. 바퀴를 다시 발명하지 않는 것이 전부입니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.