awj*_*awj 6 sql azure azure-sql-database
我正在尝试在 Azure 上自动初始化 SQL DB。对于某些(查找)表,每次初始化时都需要将数据从源 DB 复制到新 DB 中。
为此,我执行一个查询,其中包含
SELECT * INTO [target_db_name]..[my_table_name] FROM [source_db_name].dbo.[my_table_name]
Run Code Online (Sandbox Code Playgroud)
此时抛出一个异常告诉我
此版本的 SQL Server 不支持在“source_db_name.dbo.my_table_name”中引用数据库和/或服务器名称。
对此进行研究后,我发现现在可以引用另一个 Azure SQL DB,前提是它已配置为外部数据源。[这里和这里]
因此,在我的目标数据库中,我执行了以下语句:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL cred
WITH IDENTITY = '<username>',
SECRET = '<password>';
CREATE EXTERNAL DATA SOURCE [source_db_name]
WITH
(
TYPE=RDBMS,
LOCATION='my_location.database.windows.net',
DATABASE_NAME='source_db_name',
CREDENTIAL= cred
);
CREATE EXTERNAL TABLE [dbo].[my_table_name](
[my_column_name] BIGINT NOT NULL
)
WITH
(
DATA_SOURCE = [source_db_name],
SCHEMA_NAME = 'dbo',
OBJECT_NAME = 'my_table_name'
)
Run Code Online (Sandbox Code Playgroud)
但是该SELECT INTO语句仍然产生相同的异常。
此外,一个简单的SELECT * FROM [source_db_name].[my_table_name]产生异常“无效的对象名称'source_db_name.my_table_name'”。
我错过了什么?
更新
我发现了问题:在目标数据库中CREATE EXTERNAL TABLE创建了一个表。要对此进行查询,不应使用源数据库名称。所以我失败的地方:
SELECT * FROM [source_db_name].[my_table_name]
Run Code Online (Sandbox Code Playgroud)
我明白我真的应该查询
SELECT * FROM [my_table_name]
Run Code Online (Sandbox Code Playgroud)
看起来您可能需要根据正确的语法来定义该外部表:
CREATE EXTERNAL TABLE [dbo].[source_table](
...
)
WITH
(
DATA_SOURCE = source_db_name
);
Run Code Online (Sandbox Code Playgroud)
现在,由于您正在创建一个外部表,因此查询可以假装外部表是我们的 [target_db] 的本机对象 - 这允许您编写查询SELECT * FROM [my_table_name],正如您从编辑中发现的那样。从文档中,值得注意的是“这允许对远程数据库进行只读查询”。因此,该表对象不可写,但您的问题仅提到从中读取以填充新表。
| 归档时间: |
|
| 查看次数: |
3604 次 |
| 最近记录: |