我在Azure中创建了一个外部数据源,作为无法在Azure平台上创建LINKED SERVERS的替代方法。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'secretpassword';
CREATE DATABASE SCOPED CREDENTIAL LinkedServerCredential
WITH IDENTITY = 'login_name', SECRET = 'login_password-here';
CREATE EXTERNAL DATA SOURCE LinkedProductionDb
WITH
(
TYPE=RDBMS,
LOCATION='azure.database.windows.net',
DATABASE_NAME='ProductionDb',
CREDENTIAL= LinkedServerCredential
);
一切都很好,没有错误,并且语句成功执行。所以现在我创建一个EXTERNAL TABLE,它具有与驻留在EXTERNAL DATASOURCE中定义的底层数据库中的表相同的表结构;但我希望它在不同的SCHEMA下分配,以便能够将其区分为目标数据库中的链接表。所以我尝试这个:
CREATE EXTERNAL TABLE [LNK].[Transactions](
TransactionId BIGINT NOT NULL,
CustomerId BIGINT NOT NULL,
SubscriptionId BIGINT NOT NULL,
ProductId BIGINT NOT NULL,
TransType VARCHAR(100),
TransKind VARCHAR(100),
Success BIT,
Amount MONEY,
GatewayUsed VARCHAR(100),
RecordImportDate DATETIMEOFFSET,
)
WITH
(
DATA_SOURCE = LinkedProductionDb
)
GO
现在令人惊讶的是,我能够毫无问题地创建这个EXTERNAL TABLE;除了当我尝试通过简单查询访问数据时。我收到错误:“从一个或多个分片检索数据时出错。收到的基础错误消息是:'无效的对象名'LNK.Transactions'。'。”
我花了几分钟时间思考一下我做了什么以及为什么我收到错误。显然,由于原始数据库中的表不是在LNK模式下创建的;它是一个无效的对象。
那么有什么方法或有条理的做法可以用来区分我的EXTERNAL TABLES和我的数据库中的物理表吗?
显然,除其他外;毫无疑问,这是将SQL中单独定义的对象作为LINKED SERVERS的优点之一。
我知道如果他们都需要驻留在同一个数据库中,我不能成为唯一一个看到隔离对象以便清楚地区分对象的人。
我通过使用[schema]。[table]在外部服务器上创建一个我想要隔离的视图来实现这一点。在您的情况下,您将使用在LinkedProductionDb中创建名为[LNK]。[Transactions]的视图,然后一切正常。
通过使用WITH
选项SCHEMA_NAME
和OBJECT_NAME
,可以使用与外部表中使用的模式不同的模式创建外部表。
来自微软:
CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name
( { <column_definition> } [ ,...n ])
{ WITH ( <rdbms_external_table_options> ) }
)[;]
<rdbms_external_table_options> ::=
DATA_SOURCE = <External_Data_Source>,
[ SCHEMA_NAME = N'nonescaped_schema_name',] -- This is what we want
[ OBJECT_NAME = N'nonescaped_object_name',] -- ^
在WITH
中,如果你指定SCHEMA_NAME
和OBJECT_NAME
,你可以将EXTERNAL TABLE
命名为其他数据库与表的名称。
例:
CREATE EXTERNAL TABLE [LNK].[Transactions](
TransactionId BIGINT NOT NULL,
CustomerId BIGINT NOT NULL,
SubscriptionId BIGINT NOT NULL,
ProductId BIGINT NOT NULL,
TransType VARCHAR(100),
TransKind VARCHAR(100),
Success BIT,
Amount MONEY,
GatewayUsed VARCHAR(100),
RecordImportDate DATETIMEOFFSET,
)
WITH
(
DATA_SOURCE = LinkedProductionDb,
SCHEMA_NAME = 'dbo', -- This is the name of the schema on the host database
OBJECT_NAME = 'Transactions' -- Name of the table on the host database
)
GO
现在您可以将此表用作LNK.Transations
(假设架构LNK
有效)。