SQL Azure (18) 使用External Table实现垮库查询

本文介绍在Azure SQL Database中实现垮库查询的方法,通过创建外部表和数据源,实现跨Server数据库的数据联合查询。

  《Windows Azure Platform 系列文章目录

 

  问题

  1.我们在进行SQL Server开发的时候,经常会使用垮库查询。但是在默认情况下,使用Azure SQL Database不支持垮库查询。如下图:

  

  2.我们执行垮库查询语句,如下:

SELECT A.CustomerID,A.FirstName, A.LastName,B.OrderID FROM   CRMDB.dbo.CustomerInfo AS A LEFT JOIN OrderDB.dbo.OrderInfo AS B ON   A.CustomerID=B.CustomerID

 

  3.会出现以下的报错信息:

  

  4.可以看到,在默认情况下,使用Azure SQL Database不支持垮库查询。

 

  使用外部表:

  准备工作

  1.我们这里增加一些难度。我们在Azure SQL Database分别创建2个Server。如下图:

  

  注意,为了避免出现跨Azure数据中心之间的延时,请尽量在同一个数据中心创建Server。笔者在中国东部数据中心,创建2个Server

 

  2.我们在这2个Server下创建2个不同的Database,如下图:

 

  3.使用SSMS,连接到ew79sank1x.database.chinacloudapi.cn,1433,数据库CRMDB,创建表CustomerInfo

create table dbo.CustomerInfo
(
    CustomerID nvarchar(100) not null primary key,
    FirstName nvarchar(100) not null,
    LastName nvarchar(100) not null
)
Go

insert into CustomerInfo(CustomerID,FirstName,LastName) values 
('001','Jason','Zhang'),
('002','Peter','Huang'),
('003','Jason','Hu'),
('004','Mike','Lee')

 

  4.使用SSMS,连接到lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB,创建表OrderInfo

create table dbo.OrderInfo
(
    OrderID nvarchar(100) not null,
    CustomerID nvarchar(100) not null,
)
Go

insert into OrderInfo(OrderID,CustomerID) values 
('2013010100001','001'),
('2013010100002','001'),
('2013010100003','002'),
('2013010100004','002'),
('2013010100005','002'),
('2013010100006','003'),
('2013010100007','004')

 

  创建外部表

  1.使用SSMS,连接到ew79sank1x.database.chinacloudapi.cn,1433,数据库CRMDB。执行以下脚本

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'; 
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred 
WITH IDENTITY = '<username>', 
SECRET = '<password>';  

  请注意:上面的<username>和<password>,是连接到lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB的用户名和密码。注意是连接到另外的Server和Databse,不是自己。

 

  2.执行以下命令

CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc WITH 
    (TYPE = RDBMS, 
    LOCATION = 'lcqyvtqri1.database.chinacloudapi.cn', 
    DATABASE_NAME = 'OrderDB', 
    CREDENTIAL = ElasticDBQueryCred, 
) ;

  连接到lcqyvtqri1.database.chinacloudapi.cn,1433

 

  3.创建外部表

CREATE EXTERNAL TABLE dbo.OrderInfo
(
    OrderID nvarchar(100) not null,
    CustomerID nvarchar(100) not null
)
WITH 
( DATA_SOURCE = MyElasticDBQueryDataSrc)

  注意:上面创建的External Table的Table Name和Table Schema,必须与Azure SQL Database: lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB中的表OrderInfo的Table Name和Table Schema一样。

 

  4.执行完毕后,我们可以在ew79sank1x.database.chinacloudapi.cn,1433,查看到原本保存在lcqyvtqri1.database.chinacloudapi.cn,1433的数据库OrderDB中的表dbo.OrderInfo。如下图:

 

  5.我们可以执行以下语句,查询dbo.OrdrInfo表的内容:

SELECT [OrderID],[CustomerID] FROM [dbo].[OrderInfo]

 

  

  执行结果,就是我们在lcqyvtqri1.database.chinacloudapi.cn,1433数据库OrderDB中的表dbo.OrderInfo的值

  

  6.执行查询语句:

SELECT A.CustomerID,A.FirstName, A.LastName,B.OrderID FROM dbo.CustomerInfo AS A LEFT JOIN dbo.OrderInfo AS B ON A.CustomerID=B.CustomerID

  如下图:

  

 

 

  参考资料:

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-getting-started-vertical/

<think>嗯,用户要求了解Microsoft Dynamics 365和Azure SQL常见的数据库问题或配置。我需要结合Dynamics 365与Azure SQL集成的典型场景来组织信息。 首先考虑连接配置这个基础环节。Dynamics 365通过Linked Server或Azure Data Factory连接Azure SQL时,防火墙规则和身份验证方式是最常见的绊脚石。特别是当使用Azure Active Directory集成认证时,服务主体的权限配置容易出错,这点需要强调。 数据同步方面的问题通常更复杂。增量同步策略的设计很关键,尤其是变更数据捕获(CDC)的启用和轮询频率设置。用户可能遇到同步延迟或数据冲突,这涉及到事务隔离级别的调整和冲突解决机制的配置。 性能优化这块要分两层说。Azure SQL本身的性能调优包括内存优化表和列存储索引的应用,而Dynamics 365端则需要关注FetchXML查询效率。有意思的是两者之间的交互——比如批量操作时如何合理设置批处理大小来平衡吞吐量与锁竞争。 安全配置容易被低估。除了基本的TLS加密,行级安全性(RLS)在多租户场景特别重要。但要注意Dynamics 365的插件若涉及跨实体查询,可能会和RLS策略产生意料之外的交互。 维护任务自动化是运维重点。用户常忽略日志清理策略,导致事务日志不断增长。这里可以关联Azure Automation的解决方案,特别是如何协调Dynamics 365的批量删除作业与SQL索引维护的时序问题。 故障排查部分应该突出典型错误代码。比如链接服务器查询超时(错误732)往往意味着需要调整分布式查询参数,而SSIS包执行失败(错误代码-1071636471)可能指向身份认证问题。这些具体代码比笼统的描述更有用。 最后考虑知识延伸点。PolyBase的应用是个有趣方向——虽然传统认知里它用于数据仓场景,但在整合Dynamics 365和Azure SQL数据湖时能简化ELT流程。不过要提醒用户注意数据类型映射的陷阱。 生成问题时侧重可操作性:连接测试的具体方法、索引优化的评估指标、安全审计的实现路径等。这些问题应该能帮助用户从理论转向实践。</think>以下是Microsoft Dynamics 365与Azure SQL数据库集成中的常见配置问题和解决方案: --- ### 一、连接配置问题 1. **身份验证失败** - **原因**:Dynamics 365使用服务主体(Service Principal)或托管身份(Managed Identity)连接Azure SQL时权限不足 - **解决**: ```sql CREATE USER [<D365-App-Name>] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [<D365-App-Name>]; ALTER ROLE db_datawriter ADD MEMBER [<D365-App-Name>]; ``` > 需在Azure SQL中配置Azure AD管理员并启用AAD身份认证[^1] 2. **防火墙拦截** - 将Dynamics 365的IP范围(如地域性出站IP)加入Azure SQL防火墙白名单 - 启用 **"允许Azure服务和资源访问此服务器"** 选项 --- ### 二、数据同步问题 1. **增量同步延迟** - **优化方案**: - 在Azure SQL中启用变更跟踪(Change Tracking): ```sql ALTER DATABASE [YourDB] SET CHANGE_TRACKING = ON; ALTER TABLE [dbo].[TargetTable] ENABLE CHANGE_TRACKING; ``` - 使用Azure Data Factory的 *Mapping Data Flow* 配置CDC管道 2. **数据类型映射错误** - 常见冲突: | Dynamics 365类型 | Azure SQL推荐类型 | |------------------|-------------------| | 多行文本 | NVARCHAR(MAX) | | 选项集 | INT | | 货币 | DECIMAL(19,4) | --- ### 三、性能优化配置 1. **查询性能下降** - **解决方案**: - 为频繁筛选字段添加索引(如`createdon`字段) ```sql CREATE NONCLUSTERED INDEX IX_CreatedON ON [dbo].[D365_Entity] (createdon DESC); ``` - 启用列存储索引加速分析查询 - 避免在D365插件中执行复杂SQL查询(改用批量操作API) 2. **连接池耗尽** - 在连接字符串中添加参数: ``` Pooling=true; Max Pool Size=100; Connection Timeout=30; ``` - 监控指标:`sys.dm_exec_connections`中的会话数 --- ### 四、安全合规配置 1. **静态数据加密** - 启用Azure SQL的透明数据加密(TDE) ```sql ALTER DATABASE [YourDB] SET ENCRYPTION ON; ``` - 使用Azure Key Vault管理加密密钥 2. **行级安全(RLS)** ```sql CREATE SECURITY POLICY D365_Filter ADD FILTER PREDICATE dbo.fn_securitypredicate(organization_id) ON dbo.SalesData WITH (STATE = ON); ``` > 根据`organizationid`自动隔离不同客户的数据[^1] --- ### 五、维护与监控 1. **自动索引优化** ```sql ALTER DATABASE [YourDB] SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON); ``` 2. **监控警报配置** - 关键指标警报: - DTU利用率 > 80% - 死锁数 > 5/分钟 - 存储空间使用率 > 85% --- ### 典型错误代码排查 | 错误代码 | 原因 | 解决方案 | |----------|-----------------------|------------------------------| | 40515 | 防火墙阻挡 | 添加出站IP到白名单 | | 18456 | 登录失败 | 检查服务主体权限 | | 1205 | 死锁 | 优化事务隔离级别(改用READ_COMMITTED_SNAPSHOT) | | 10928 | 资源池耗尽 | 增加DTU层级或优化查询 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值