4

私はいくつかの強力なシェル スクリプトを作成しており、主に Invoke-Sqlcmd をデータベースのクエリまたは入力 .sql ファイルの手段として使用していますが、アクセスの封じ込めとプロセスの強制終了に問題がありました。

プロセスを強制終了するために SMO を使用しています

$SQlSvr1 = New-Object Microsoft.SqlServer.Management.Smo.Server $serverInstance
$SQlSvr1.KillAllprocesses($databaseMain)

そして、Invoke-Sqlcmd を使用してプロセスを実行すると、次のようなエラーが発生し始めるまで、すべて正常に実行されていました。

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) 

プロセスを強制終了しなかった場合は、戻ります

データベースが使用中のため、排他アクセスを取得できませんでした。

だから私の質問は、安定した接続を再生成または維持するための最良のプロセスは何ですか?すべてをSMOまたはSQLConnectionに変更するか、Invoke-Sqlcmdを使用して単一の接続を作成する方法があるかどうかはわかりませんが、毎回強制終了/再キューイングします呼び出しを使用します。

問題のスクリプトは最初にデータベースをバックアップし、try/catch 内でパッチ スクリプトを使用して実行および更新します。

4

1 に答える 1

5

3つすべてに用途があります。

invoke-sqlcmdクイック & ダーティー クエリ、または他のファイルに既に存在するクエリ (ファイル パラメーターを渡すことができるため) が好きです。ただし、質問を引き起こしたエラーに対処する必要はありませんでした。

より多くの安全性が必要な場合 (パラメーター化されたクエリなど) や、より永続的な接続を維持したい場合 (大量のクエリを立て続けに実行している場合) にSQLConnection&を使用します。SQLCommand短時間でつながります。

SMO 私は実際には使用していませんが、「システム」レベル (ジョブ、バックアップなど) で管理するために取っておきます。SMO を使用すると、ほぼすべてのことができます。先月の彼のブログ(オフィスのファイアウォールが不明な理由でブロックしているため、投稿にリンクできません)。私は通常、T-SQL クエリを使用してこれを行いますが、どちらの方法でも機能します。SMO を使用すると、何らかの利点があるはずです。

于 2013-03-05T16:14:37.220 に答える