如何在 Azure SQL 中创建外部表以访问同一子网上的本地 SQL Server 中的表。选择时出错

问题描述 投票:0回答:1

我有许多 Azure SQL 数据库,我希望能够访问本地 SQL Server 数据库(非命名实例)中的外部表。本地 SQL Server 表有一个我想使用的触发器,因为 Azure SQL 数据库没有触发器。 Azure SQL 数据库中的存储过程将写入本地数据库并触发事件。

我已完成以下操作:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxxx';
CREATE DATABASE SCOPED CREDENTIAL [SignalRxCredential] 
    WITH IDENTITY='normalLogon',SECRET='normalPassword';  -- SQL Server authentication

CREATE EXTERNAL DATA SOURCE [SignalRxDataSource]    
WITH (
    TYPE = RDBMS,  
    LOCATION = 'sqlserver://10.0.0.6',  
    DATABASE_NAME = 'staging',  
    CREDENTIAL = [SignalRxCredential]
);

CREATE EXTERNAL TABLE [dbo].[EmailNotifications_ext]
(
    [MessageID] [int] NOT NULL,
    [Subject] [varchar](255) NULL,
    [Recipient] [varchar](255) NULL,
    [SendFrom] [varchar](255) NULL,
    [MessageText] [nvarchar](max) NULL
) 
WITH (DATA_SOURCE=[SignalRxDataSource],SCHEMA_NAME=N'dbo',OBJECT_NAME=N'EmailNotifications')

它成功创建了范围凭证和外部表,但是当我尝试从中选择记录时,出现此错误:

建立与远程数据源的连接时出错:[Microsoft][ODBC Driver 17 for SQL Server]命名管道提供程序:无法打开与 SQL Server [53] 的连接。
[Microsoft][ODBC Driver 17 for SQL Server]登录超时已过期[Microsoft][ODBC Driver 17 for SQL Server]
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。

我已经仔细检查了凭据,并且已连接到 Azure SQL 服务器,并且本地 SQL Server 是相同的 SSMS...因此可以通过 TCP/IP 和 SQL Server 身份验证来访问这两个数据库。命名管道已启用,并在本地服务器上选中允许远程连接。

我错过了什么以及我需要做什么才能使其正常工作?

sql-server azure-sql-database external-tables
1个回答
0
投票

Azure SQL 数据库不支持直接连接到外部表的本地 SQL Server 实例。这就是您遇到连接错误的原因。

如果您尝试在 Azure SQL 不支持表触发器的基础上创建该外部表,请注意,Azure SQL 确实支持触发器,如文档中所述。

下面您将了解如何在 Azure SQL 上创建触发器:

create table testusers  
(userid int,  
[password] varchar(20))  
  
insert into testusers values  
(1,'password1'),  
(2,'password2'),  
(3,'password3')  
  
create table pswlog  
(userid int,  
oldpassword varchar(20),  
newpassword varchar(20),  
updatetime datetime)  

CREATE TRIGGER psw_trigger  
ON testusers  
AFTER  UPDATE  
AS  
IF ( UPDATE ([password]) )  
BEGIN  
insert into pswlog   
select a.userid,c.password,a.password,getdate() from inserted a  
inner join testusers b on a.userid=b.userid  
inner join deleted c on a.userid=c.userid  
END;  

-- Fire the trigger

update  testusers set password='password11' where userid=1  
update  testusers set password='password111' where userid=1  
update  testusers set password='password22' where userid=2 

-- Examine log created by the trigger

select * from pswlog  
© www.soinside.com 2019 - 2024. All rights reserved.