2017-10-04 8 views
1

GNAF(オーストラリアのロケーションデータセット)を新しいデータベースにインポートするプロセスを自動化しようとしています。 私が午前問題は、私はデータベースに試してみて、私は、データベースを言って、エラーを取得し、それを再作成する際に使用されていることである:SSMSのためSuspended Invoke-SQLcmdクエリ - 使用中のデータベース

Invoke-Sqlcmd : Cannot drop database "GNAF" because it is currently in use. At line:11 char:5 
+  Invoke-Sqlcmd -Query "IF EXISTS (SELECT name FROM master.dbo.sysd ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException 
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand Invoke-Sqlcmd : Database 'GNAF' already exists. Choose a different database name. At line:15 char:5 
+  Invoke-Sqlcmd -Query "CREATE DATABASE GNAF" -serverinstance $Serv ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException 
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand 

アクティビティモニタでは示しています

enter image description here

これは、呼び出される関数です。

function importQNAF { 

$ScriptPath = "C:\Users\owain.esau\Scripts\PowerShell\SQL-Server\TRIS Database Anon\" # change to pwd for live 
$QNAFpath1 = ($ScriptPath + "GNAF\G-NAF\G-NAF AUGUST 2017\Standard\") 
$QNAFpath2 = ($ScriptPath + "GNAF\G-NAF\G-NAF AUGUST 2017\Authority Code\") 
$GNAF_ImportData_Path = ($ScriptPath + "\SQLScripts\GNAF_ImportData.sql") 

(Get-Content $GNAF_ImportData_Path).replace("Powershell To Change#1", $QNAFpath1) | Set-Content $GNAF_ImportData_Path 
(Get-Content $GNAF_ImportData_Path).replace("Powershell To Change#2", $QNAFpath2) | Set-Content $GNAF_ImportData_Path 

## Drop and Create Table 
Invoke-Sqlcmd -Query "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name ='GNAF') 
         BEGIN 
         ALTER DATABASE GNAF SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
         DROP DATABASE GNAF; 
         END 
        ;" -serverinstance $ServerAddress; 
Start-Sleep -s 5; 
Invoke-Sqlcmd -Query "CREATE DATABASE GNAF" -serverinstance $ServerAddress; 
Start-Sleep -s 5; 

Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_CreateTables.sql") -serverinstance $ServerAddress; 

try { 
    Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_ImportData.sql") -serverinstance $ServerAddress -querytimeout 0; 
} catch { 
    if ($error -match "Access is denied.") { 
     Write-Host "[!] ERROR: Access denied to GNAF folder." 
     Write-Host "----------------------------------------" 
     Write-Host "You have two options: " 
     Write-Host "" 
     Write-Host " 1) Give MSSQLSERVER full access to" $ScriptPath 
     Write-Host " 2) Copy the1 folder: " $ScriptPath"GNAF to the MSSQL Source folder (C:\Program Files\SQL Server)" 

     Do { 
      switch(Read-Host "Please choose an action (1 or 2)") { 
       1 { 
        $Acl = (Get-Item $ScriptPath).GetAccessControl('Access'); 
        $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("NT SERVICE\MSSQLSERVER", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"); 
        $Acl.SetAccessRule($Ar); 
        Set-Acl $ScriptPath $Acl; 
        importQNAF; 
       } 
       2 { Write-Host "Not coded yet"; } 
       default { "Invalid Entry, must be 1 or 2"; } 
      } 
     } Until ($choice -eq 1 -or $choice -eq 2) 
    } 
} 

(ゲット・コンテンツ$ GNAF_ImportData_Pathを).replace($ QNAFpath1、「ポウrshellを変更するには#1 ")|セットコンテンツ$ GNAF_ImportData_Path (Get-Content $ GNAF_ImportData_Path).replace($ QNAFpath2、 "Powershell To Change#2")|セット内容$ GNAF_ImportData_Path } 私は実際にSQLサーバーにデータをインポートするために使用していたスクリプトは、このページで見つかったものとほぼ同じです:

https://www.rednotebluenote.com/2016/04/importing-psma-geocoded-national-address-file-g-naf-to-sql-server/

それはSSMSで直接正常に動作します。また、私は私のエラーマッチは正しいエラーをピックアップしているとは思わない、代わりにすべてのエラーに一致しています。

---更新------------------------------------------ ----

機能の開始時にMSSQLSERVERサービスを再起動したときに実行されるように管理されています。

問題は今、それがタイムアウトにある: - SSMAで実行5分、このエラーがポップアップする前に

Invoke-Sqlcmd : Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
BULK INSERT [MB_2011] FROM 'C:\Users\owain.esau\OneDrive\Scripts\PowerShell\SQL-Server\TRIS Database Anon\GNAF\G-NAF\G-NAF AUGUST 2017\Standard\ACT_MB_2011_psv.psv' WITH (FIELDTERMINATOR = '|', ROWTERMINATOR = 
'\n', FIRSTROW = 2, ROWS_PER_BATCH=100000, TABLOCK) 
At line:30 char:9 
+   Invoke-Sqlcmd -InputFile ($ScriptPath + "SQLScripts\GNAF_Imp ... 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException 
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand 

それだけで、実際のスクリプトであること実行が約3をとり、約45秒間動作します。

(関数が少し更新されている)

+0

SQL Serverの再起動を停止してくださいます。再起動で「解決済み」の他の問題があります。それはハンマーであなたの親指を打つことによって頭痛を治すようなビットです。確かに、あなたの頭はもはや痛くはありませんが、それは賢明ですか? – vonPryz

+0

私はPowerShellから再起動する方法を知っていたので、これはデータベースのないローカルホスト上にあったので、問題はありませんでした。それを下の提案に切り替えてください。 –

答えて

1

データベースへの既存の、オープンな接続を終了する必要があります。ここで

は、最も簡単な方法(それは基本的に殺されるために他のすべての接続を強制的に)

IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name ='GNAF') 
    BEGIN 
    ALTER DATABASE GNAF SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
    DROP DATABASE GNAF; 
    END 
; 
+0

返信いただきありがとうございます、私はちょうどSQLサービスを再起動した後、これを考え出しました。また、2回目のinvoke-sqlcmd呼び出しに-querytimeout 0を追加する必要がありました。サービスを再開するよりも、あなたの方法は優れていますか? –

+0

サービスを再起動する必要はありません。 – gvee

関連する問題