タグ: SQL Server 2019

  • SQL Serverで分散トランザクションのエラーが出たときの対処

    Windows Server 2022とSQL Server 2019組み合わせで、リンクサーバの設定をして、リンクサーバのテーブルにアクセスしたところ、下記のメッセージが表示された。

    分散トランザクションを開始できなかったので、この操作を実行できませんでした。

    これの対処して、下記の手順で設定変更を行う。

    1.Windowsキーを押して、「コンポーネント サービス」(途中に半角スペースあり)と入力して、コンポーネント サービスを起動する

    2.「コンソール ルート」→「コンポーネント サービス」→「コンピューター」→「マイ コンピューター」→「Distributed Transaction Coordinator」→「ローカル DTC」の順に選択する

    3.「ローカル DTC」を右クリックし、プロパティを開く

    4.プロパティの「セキュリティ」タブを選択する

    5.下記の5つにチェックを入れて、適用をクリックする。

        * ネットワーク DTC アクセス
        * リモートクライアントを許可する
        * リモート管理を許可する
        * 受信を許可する
        * 送信を許可する

    6.MSDTCサービスの停止と再開の警告がでるので、「はい」をクリックする。成功すると、MSDTCサービスを再開した旨のポップアップがでる。

    7.SQL Serverのサービスを再起動する(もしくはOSを再起動する)

    これを、リンクサーバで設定する相互のサーバで行う。

    参考)

  • SQL Server 2019でsaでログインできない

    SQL Server 2019で、インストール後に、saでログインしようとしたらエラーでログインできず。サーバー認証は「SQL Server 認証モードと Windows 認証モード」にしてある。パスワードはインストール時に設定したものと同じはず。

    念のため、saのパスワードを再設定したところ、無事にログインできた。

  • SQL Serverのプロシージャー作成でANSI_NULLSオプションのエラーが発生

    古いSQL Server 2005 からバージョンの新しいSQL Server 2019に、プロシージャーを移行しようとしたところ、下記のエラーが表示され、プロシージャーが作成できなかった。

    異種クエリでは接続時に ANSI_NULLS オプションと ANSI_WARNINGS オプションが設定されている必要があります。これは一貫したクエリ セマンティクスを保証します。これらのオプションを有効にし、クエリを再実行してください。

    これの対応として、プロシージャーの最初に、「SET ANSI_NULLS ON」と「SET ANSI_WARNINGS ON」の設定を追加した。これを追加した後に、実行すると、正常にプロシージャーの作成ができた。

    参考)

    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    SET ANSI_NULLS ON 
    GO 
    SET ANSI_WARNINGS ON 
    GO
  • リンクサーバのテーブルにアクセスするSQL

    リンクサーバのテーブルにアクセスするには、「[リンクサーバー名].[DB名].dbo.[テーブル名]」の形式でテーブルにアクセスする。これを、SELECT文、INSERT文などにすると、下記のようになる。

    SELECT * FROM [リンクサーバー名].[DB名].dbo.[テーブル名];
    INSERT INTO [リンクサーバー名].[DB名].dbo.[テーブル名] (カラム名, カラム名) VALUES ('値', '値');
    UPDATE  [リンクサーバー名].[DB名].dbo.[テーブル名]  SET 列名 = 値 ;
    DELETE FROM [リンクサーバー名].[DB名].dbo.[テーブル名];
  • SQL Serverのデータベースコピーができる条件

    SQL Server Management Studio(SSMS)で、タスクからデータベースのコピーを選べるものと選べないものがある。ずっと、なんでなんだろうかと思っていた。やっと理由がわかった。SSMSからデータベースのコピーができないのは、そのデータベースがSQL ServerのExpress Editionだからだ。または、SQL ServerのStandard Editionであっても、SQL Server Agentのサービスが起動していないとき。

    SSMSでデータベースのコピーができるのは、以下の2つの条件を満たしているもののみ。

    • SQL ServerのStandard Edition以上(Express Editionではできない)
    • SQL Server Agentのサービスがコピー元とコピー先で起動していること。(起動していないと失敗する)

    SSMSのバージョンか、設定だと思っていたが、SSMSではなくて、SQL Serverの問題だった。

    参考URL

    https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/use-the-copy-database-wizard?view=sql-server-ver15

  • SQL Server 2005から SQL Server 2019へのリンクサーバーの接続ができた

    前回、SQL Server 2019からSQL Server 2005へのリンクサーバーでの接続ができたので、今度はその逆を試した。Windows Server 2003の上のSQL Server 2005から、Windows Server 2022の上のSQL Server 2019に対して、リンクサーバーの設定をしたところ、接続でき、データの参照もできた。

    リンクサーバーの設定のとき、接続は「SQL Server」を選択して、接続した。

  • SQL Server 2019からSQL Server 2005へのリンクサーバーの接続ができた

    Windows Server 2022にインストールしたSQL Server 2019から、Windows Server 2003のSQL Server 2005に対して、リンクサーバーの設定を行ったところ、接続できた。

    SQL Server 2019から、リンクサーバー経由で、SQL Server 2005のテーブルの参照(Select)も更新(Update)もできた。SQL Server 2005はサポート終了しているので、マイクロソフトのサポート外だが。それにしても、SQL Server 2019からSQL Server 2005に接続とは、下位互換性が高い。本当に。

    SQL Server 2019からSQL Server 2005へのリンクサーバーの設定は、SQL Server Management Studioから「サーバーオブジェクト」の「リンクサーバー」を選択して、右クリックから「新しいリンクサーバー」で作成した。作成時、プロバイダーは「SQL Server Native Client 11.0」を選択した。これだけで繋げるのだから、楽である。

  • SQL Serverの名前付きインスタンスはUDP 1434を使用する

    SQL Serverへの接続に使用するポートは、通常、TCPの1433番ポート。デフォルトでインストールしたSQL Server(既定のインスタンス)しかなければ、これで接続できる。名前付きで、SQL Serverをインストールした場合は、SQL Server Browerサービスを使用することにより、1434番ポートで、UDPを使用する。

    SQL Serverでポート番号を調べると、1433と1434が出てくるのだが、これをTCPだけで設定してしまうと、SQL Server Browerサービスを介した名前解決でエラーになる。エラー時には、エラー番号の26なので、SQL Server Browerサービスの起動を確認するのだが、これが起動されている場合には、UDPの1434番ポートが通信可能になっているかを通信経路上(SQL Serverのサーバと、経路のネットワークと、クライアント)で確認する。

    Provider: SQL Network Interface, error: 26

    さらに注意事項として、名前付きインスタンスが動的ポートで構成されるようになっている場合(デフォルトだと動的ポート)、1433番ポートを使用して、SQL Serverが起動していない。名前付きインスタンスの1つしかインストールされていない場合には、起動ポートを1433に固定することで、他のポートは空けなくてもよい。

    参考: https://docs.microsoft.com/ja-jp/troubleshoot/sql/connect/resolving-connectivity-errors

  • SSMSでテーブルのデータからINSERT文を生成する

    SSMS(SQL Server Management Studio)のバージョンは、18.5で確認。

    1. SSMSを開き、SQL Serverに接続する。
    2. INSERT文を作成するDBを選ぶ。
    3. 右クリックから「タスク」「スクリプトの生成」を選ぶ。
    4. ウィザードが立ち上がる。
    5. 「次へ」をクリックする
    6. INSERTを作成したいテーブルを選び、「次へ」をクリックする。
    7. スクリプト作成オプションの設定画面になるので、「詳細設定」をクリックする。(ここがポイント)
    8. 「スクリプトを作成するデータの種類」でプルダウンから「データのみ」を選択する(ここがポイント)
    9. 「OK」をクリックする
    10. 保存方法を選択して、「次へ」
    11. 内容を確認して、「次へ」
    12. 結果が成功になっていれば、「完了」をクリックして終わり。
    13. 保存先を確認する。

    この手順でわかりにくいのが、「詳細設定」から「スクリプトを作成するデータの種類」を探して「データのみ」を選択するところ。ここを変更しないと、スキーマの情報しかスクリプトとして作成してくれない。

  • Veeam BackupがRPCの呼び出しに失敗してエラーになる

    Veeam Backupで仮想マシンのバックアップかつSQL Serverのバックアップを行ったところ、下記のエラーでバックアップの取得が失敗した。

    Processing Server01 Error: Failed to check whether snapshot is in progress (network mode). RPC function call failed. 
    Function name: [IsSnapshotInProgress]. 
    Target machine: [Server01.ad.xenos.jp]. 
    RPC error:RPC サーバーを利用できません。  
    Code: 1722  01:41
    

    原因は、RPC(リモートプロシージャコール)へのアクセスがWindowsのファイアウォールで禁止されていたから。

    対応として、「セキュリティが強化されたWindows Defenderファイアウォール」を開き、「スケジュールされたリモートタスク管理(RPC)」と「スケジュールリモートタスク管理(RPC-ESMAP」の許可ルールを有効にする。

    参考: https://www.veeam.com/kb1174