2016-08-23 21 views
2

我在Azure中创建了一个EXTERNAL DATA SOURCE,作为无法在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 

现在令人惊讶的是,我能够创建此外部表没有任何问题;除了当我试图通过简单查询访问数据时。我收到错误:“从一个或多个分片中检索数据时出错。收到的基础错误消息是:'无效的对象名'LNK.Transactions'。'。”

它只花了我几分钟时间思考我做了什么,为什么我收到了错误。显然,由于原始数据库中的表格不是在LNK模式下创建的,这是一个无效的对象。

那么有什么方法或系统的做法,我可以用来区分我的数据库中的物理表我的外部表?

很明显,除其他外,毫无疑问,这是SQL中单独定义对象作为LINKED SERVERS的好处之一。

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

回答

1

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

+0

谢谢,这不是理想的我想到的,但我想它是唯一合理的替代方案。不胜感激! – Mark

+0

好主意。表名也需要相同 - 我试图将一些命名约定(如'External_Transaction')转换为外部表,以便将这些名称快速标识为外部表,但我得到了相同的错误.. –

相关问题