0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure SQL Databaseのデータベース間でSELECT INTO する方法

Last updated at Posted at 2022-02-24

エーティーエルシステムズ 鍋島です。
今回は、Azure SQLデータベースで同一サーバー上のデータベース間でSELECT INTO する方法について紹介します。
SQL Serverでは問題なく別データベースのテーブルを参照出来てたので当然出来ると思い込んでいたのですが、Azureではできないことがわかりました。

  • コピー元:TESTDB01のテーブルTable01
  • コピー先:TESTDB02のテーブルTable01

SELECT INTOでテーブルのコピーしようとしたんですが、

SELECT * INTO dbo.Table01
FROM testdb01.dbo.Table01

エラーが出力されます。なんでー!(エラーメッセージを読みましょう。)

メッセージ 40515、レベル 15、状態 1、行 16
Reference to database and/or server name in 'testdb01.dbo.Test01' is not supported in this version of SQL Server.

どうやら、別DBのテーブルを参照できないようです。

SELECT * FROM testdb01.dbo.Test01
メッセージ 40515、レベル 15、状態 1、行 16
Reference to database and/or server name in 'testdb01.dbo.Test01' is not supported in this version of SQL Server.

そこで調べたところ、別データベースのテーブルを参照できる方法がありましたので、その手順を説明します。

#別データベースのテーブルを参照する手順

次の4ステップで参照できるようになります。

  1. マスターキーを作成
  2. 資格情報を作成
  3. 外部リソースを作成
  4. 外部テーブルを作成

以下、手順の詳細です。

マスターキーを作成

マスターキーを作成していな場合は作成します。
このキーは、パスワードを使用して暗号化されます。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ここにマスターキーをコピーするためのパスワード';  

資格情報を作成

資格情報をTESTDB01USERという名前で作成します。

CREATE DATABASE SCOPED CREDENTIAL TESTDB01USER WITH IDENTITY='ここにSQLユーザー名', SECRET = 'ここにSQLユーザーのパスワード';
--作成したクレデンシャルを表示して確認
SELECT * FROM sys.database_scoped_credentials;

外部リソースを作成

データベースを外部リソースとして参照します。
作成した資格情報 TESTDB01USER を使ってtestdb01という名前で外部リソースを作成し、
データベースを参照できるようにします。

CREATE EXTERNAL DATA SOURCE testdb01 WITH
(
    TYPE = RDBMS,
    LOCATION = N'{ここにサーバー名}.database.windows.net', -- サーバ
    DATABASE_NAME = N'testdb01',                      -- データベース名
    CREDENTIAL = TESTDB01USER --作成した
)

外部テーブルを作成

外部テーブルの作成し、データベースから参照できるようにします。
外部テーブルと通常のテーブルの名前を同じにすることはできません。
今回はSELECT * INTO したいので、同じ名前のテーブルがあると都合が悪いので名前を変えます。
ここでは、ExternalTable01という名前に変えます。

CREATE EXTERNAL TABLE dbo.ExternalTable01
(
    Id int Not NULL,
    Value nvarchar(MAX)  NULL
)
WITH
(
    DATA_SOURCE = testdb01,
		SCHEMA_NAME='dbo',    --スキーマ
		OBJECT_NAME='Table01' --元々のテーブル名
)
GO

これでテーブルが参照できるようになったので、無事SELECT INTOできるようになりました!

SELECT * INTO dbo.Table01
FROM ExternalTable01

まとめ

外部テーブルを作成すると、他のデータベースのテーブルを参照できるようになって、SELECT * INTO もできるようになります!
(が、ちょっと面倒なのでサポートしてほしいな。)

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?