Compartilhar via


sp_data_source_objects (Transact-SQL)

Aplica-se a: SQL Server 2019 (15.x)

Retorna a lista de objetos de tabela que estão disponíveis para serem virtualizados.

Sintaxe

Convenções de sintaxe de Transact-SQL

sp_data_source_objects
        [ @data_source = ] 'data_source'
    [ , [ @object_root_name = ] 'object_root_name' ]
    [ , [ @max_search_depth = ] max_search_depth ]
    [ , [ @search_options = ] 'search_options' ]
[ ; ]

Argumentos

[ @data_source = ] 'data_source'

O nome da fonte de dados externa da qual se obtêm os metadados. @data_source é sysname.

[ @object_root_name = ] 'object_root_name'

Esse parâmetro é a raiz do nome do(s) objeto(s) a ser(em) pesquisado(s). @object_root_name é nvarchar(max), com um padrão de NULL.

Essa chamada retorna apenas objetos externos que começam com o valor definido para @object_root_name.

Se uma fonte de dados ODBC se conectar a um sistema de gerenciamento de banco de dados relacional (RDBMS) que usa nomes de três partes, @object_root_name não poderá conter um nome de banco de dados parcial. Nesses casos, o parâmetro @object_root_name deve conter as três partes, sendo que a terceira parte é o nome do objeto a ser pesquisado.

Cuidado

Devido às diferenças entre as plataformas de dados externos, algumas plataformas não retornarão resultados se o valor padrão de NULL for fornecido. Alguns tratam NULL como a ausência de um filtro. Por exemplo, o Oracle RDMBS não retornará resultados se NULL for fornecido para @object_root_name.

[ @max_search_depth = ] max_search_depth

Esse valor especifica a profundidade máxima (em partes) após @object_root_name que desejamos pesquisar. @max_search_depth é um int com um padrão de 1.

Por exemplo, um @max_search_depth de 1, com um @object_root_name que é o nome de um banco de dados do SQL Server, retornaria um esquema contido no banco de dados.

Um @max_search_depth de NULL retornará informações sobre @object_root_name se ele existir e não estiver vazio, no caso de catálogo ou esquema.

[ @search_options = ] 'search_options'

O parâmetro search_options é nvarchar(max) com um padrão de NULL.

Esse parâmetro não é usado, mas pode ser implementado no futuro.

Conjunto de resultados

Nome da coluna Tipo de dados Descrição
OBJECT_TYPE nvarchar(200) O tipo do objeto (exemplo: TABLE ou DATABASE).
OBJECT_NAME nvarchar(max) O nome totalmente qualificado do objeto. Escapado usando o caractere de aspas específico do back-end.
OBJECT_LEAF_NAME nvarchar(max) O nome do objeto não qualificado.
TABLE_LOCATION nvarchar(max) Uma cadeia de caracteres de localização de tabela válida que pode ser usada para o comando CREATE EXTERNAL TABLE. Será NULL se não for aplicável.

Permissões

Requer a permissão ALTER ANY EXTERNAL DATA SOURCE.

Comentários

A instância do SQL Server deve ter o recurso PolyBase instalado. Esse procedimento foi introduzido pela primeira vez no SQL Server 2019 CU5.

Esse procedimento armazenado oferece suporte a conectores para:

  • SQL Server
  • Oracle
  • Teradata
  • MongoDB
  • Azure Cosmos DB

O procedimento armazenado não é compatível com fontes de dados ODBC genéricas ou conectores Hadoop.

A noção de vazio x não vazio está relacionada ao comportamento do driver ODBC e da função SQLTables. Não vazio indica que um objeto contém tabelas, e não linhas. Por exemplo, um esquema vazio não contém tabelas no SQL Server. Um banco de dados vazio não contém tabelas dentro do Teradata.

Os tipos de objetos são determinados pelo driver ODBC da fonte de dados externa. Cada fonte de dados externa determina o que se qualifica como uma tabela. Isso pode incluir objetos de banco de dados como funções no Teradata ou sinônimos no Oracle. O PolyBase não pode se conectar a alguns objetos ODBC como tabelas externas e, portanto, não terá um valor na coluna TABLE_LOCATION. Apesar da ausência de valores em TABLE_LOCATION, a presença de um desses objetos ODBC pode tornar um banco de dados ou esquema não vazio.

Use sp_data_source_objects e sp_data_source_table_columns para descobrir objetos externos. Esses procedimentos armazenados no sistema retornam o esquema das tabelas que estão disponíveis para serem virtualizadas. O Azure Data Studio usa esses dois procedimentos armazenados para dar suporte à virtualização de dados. Use sp_data_source_table_columns para descobrir esquemas de tabelas externas representadas em tipos de dados do SQL Server.

Tabelas externas para coleções do MongoDB que contêm matrizes

Para criar tabelas externas para coleções do MongoDB que contenham matrizes, você deve usar a extensão de virtualização de dados do Azure Data Studio para produzir uma instrução CREATE EXTERNAL TABLE, com base no esquema detectado pelo driver ODBC PolyBase para MongoDB. As ações de nivelamento são executadas automaticamente pelo driver. Como alternativa, você pode usar sp_data_source_objects para detectar o esquema de coleção (colunas) e criar manualmente a tabela externa. O procedimento armazenado sp_data_source_table_columns também executa automaticamente o nivelamento por meio do driver ODBC do PolyBase para o driver MongoDB. A extensão de Virtualização de Dados para o Azure Data Studio e o sp_data_source_table_columns usam os mesmos procedimentos armazenados internos para consultar o esquema externo.

Observações específicas do tipo de fonte de dados

  • Teradata

    As visualizações do sistema Teradata não usam segurança em nível de linha (RLS) e, portanto, os usuários podem ver a existência de tabelas que não podem consultar.

  • MongoDB

    Algumas versões anteriores do MongoDB restringem a capacidade de listar todos os bancos de dados a usuários do tipo administrador. Os usuários sem essa permissão podem receber erros de autenticação ao tentar executar esse procedimento com um @object_root_namenulo.

  • Oracle

    Os sinônimos Oracle não são suportados para uso com o PolyBase.

Exemplos

SQL Server

O exemplo a seguir retorna todos os bancos de dados, esquemas e tabelas/exibições

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 3;

EXEC sp_data_source_objects @data_source,
    @object_root_name,
    @max_search_depth;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
DATABASE "database" database NULL
SCHEMA "database"."dbo" dbo NULL
TABLE "database"."dbo"."customer" customer [database].[dbo].[customer]
TABLE "database"."dbo"."item" item [database].[dbo].[item]
TABLE "database"."dbo"."nation" nation [database].[dbo].[nation]

O exemplo a seguir retorna todos os bancos de dados

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;

EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
DATABASE UserDatabase UserDatabase NULL
DATABASE master master NULL
DATABASE msdb msdb NULL
DATABASE tempdb tempdb NULL
DATABASE database database NULL

O exemplo a seguir retorna todos os esquemas em um banco de dados

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[database]';

EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
SCHEMA "database"."dbo" dbo NULL
SCHEMA "database"."INFORMATION_SCHEMA" INFORMATION_SCHEMA NULL
SCHEMA "database"."sys" sys NULL

O exemplo a seguir retorna todas as tabelas do esquema

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[database].[dbo]';

EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
TABLE "database"."dbo"."customer" customer [database].[dbo].[customer]
TABLE "database"."dbo"."item" item [database].[dbo].[item]
TABLE "database"."dbo"."nation" nation [database].[dbo].[nation]
TABLE "database"."dbo"."orders" orders [database].[dbo].[orders]
TABLE "database"."dbo"."part" part [database].[dbo].[part]

Oracle

O exemplo a seguir retorna o esquema completo e as tabelas, funções, exibições etc.

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[OracleObjectRoot]';
DECLARE @max_search_depth INT = 2;

EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
VIEW "SYS"."ALL_SQLSET_STATEMENTS" ALL_SQLSET_STATEMENTS [ORACLEOBJECTROOT].[SYS].[ALL_SQLSET_STATEMENTS]
SYSTEM TABLE "SYS"."BOOTSTRAP$" BOOTSTRAP$ [ORACLEOBJECTROOT].[SYS].[BOOTSTRAP$]
SYNONYM "PUBLIC"."ALL_ALL_TABLES" ALL_ALL_TABLES NULL
SCHEMA "database" database NULL
TABLE "database"."customer" customer [ORACLEOBJECTROOT].[database].[customer]

Teradata

O exemplo a seguir retorna todos os bancos de dados e tabelas, funções, exibições etc.

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 2;

EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
FUNCTION "SYSLIB"."ExtractRoles" ExtractRoles NULL
SYSTEM TABLE "DBC"."UDTCast" UDTCast [DBC].[UDTCast]
TYPE "SYSUDTLIB"."XML" XML NULL
DATABASE "database" database NULL
TABLE "database"."customer" customer [database].[customer]

Mongo DB

O exemplo a seguir retorna todos os bancos de dados e tabelas.

DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 2;

EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type OBJECT_NAME OBJECT_LEAF_NAME TABLE_LOCATION
DATABASE "database" database NULL
TABLE "database"."customer" customer [database].[customer]
TABLE "database"."item" item [database].[item]
TABLE "database"."nation" nation [database].[nation]
TABLE "database"."orders" orders [database].[orders]