不同的模式会产生从一个或多个分片中检索数据的错误。收到的基础错误消息是:无效的对象名称

问题描述 投票:4回答:2

我在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的优点之一。

我知道如果他们都需要驻留在同一个数据库中,我不能成为唯一一个看到隔离对象以便清楚地区分对象的人。

sql-server database azure
2个回答
2
投票

我通过使用[schema]。[table]在外部服务器上创建一个我想要隔离的视图来实现这一点。在您的情况下,您将使用在LinkedProductionDb中创建名为[LNK]。[Transactions]的视图,然后一切正常。


3
投票

通过使用WITH选项SCHEMA_NAMEOBJECT_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_NAMEOBJECT_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有效)。

© www.soinside.com 2019 - 2024. All rights reserved.