我有许多 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 身份验证来访问这两个数据库。命名管道已启用,并在本地服务器上选中允许远程连接。
我错过了什么以及我需要做什么才能使其正常工作?
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