Partilhar via


DROP CONNECTION (catálogo estrangeiro)

Aplica-se a:assinalado sim Databricks SQL assinalado sim Databricks Runtime 17.3 e superiores

Importante

Esta funcionalidade encontra-se na Pré-visualização Pública e só está disponível para clientes participantes neste momento. Para participar na pré-visualização, candidate-se preenchendo este formulário. Esse recurso só suporta desconexão para catálogos estrangeiros usando o Hive Metastore (HMS) e o Glue Federation.

Use o DROP CONNECTION comando para converter um catálogo estrangeiro em um catálogo padrão no Unity Catalog. Depois de descartar a conexão, o catálogo não sincroniza mais tabelas estrangeiras do catálogo externo. Em vez disso, funciona como um catálogo padrão do Unity Catalog, contendo tabelas geridas ou externas. Seu catálogo agora é rotulado como padrão em vez de estrangeiro no Unity Catalog. Este comando não afeta as tabelas no seu catálogo externo; isso afeta apenas o seu catálogo estrangeiro no Unity Catalog.

Requer OWNER ou MANAGE, USE_CATALOG e BROWSE permissões no catálogo.

Sintaxe

ALTER CATALOG catalog_name DROP CONNECTION { RESTRICT | FORCE }

Parâmetros

  • catalog_name

    O nome do catálogo estrangeiro a ser convertido em um catálogo padrão.

  • RESTRINGIR

    Comportamento padrão. DROP CONNECTION com RESTRICT falha ao converter o catálogo estrangeiro em um catálogo padrão se houver tabelas estrangeiras ou exibições estrangeiras no catálogo.

    Para atualizar tabelas estrangeiras para tabelas gerenciadas ou externas do Catálogo Unity, consulte Converter uma tabela estrangeira em uma tabela gerenciada do Catálogo Unity ou Converter uma tabela estrangeira em uma tabela externa do Catálogo Unity. Para converter visualizações estrangeiras, consulte SET MANAGED (FOREIGN VIEW).

  • FORÇA

    DROP CONNECTION com FORCE elimina quaisquer tabelas ou vistas externas restantes num catálogo externo ao converter o catálogo externo num catálogo padrão. Este comando não descarta nenhum dado ou metadados no seu catálogo externo; ele apenas solta os metadados sincronizados no Unity Catalog para criar a tabela estrangeira.

    Advertência

    Não é possível reverter este comando. Se quiser federar as tabelas estrangeiras novamente no Unity Catalog, você deve recriar o catálogo estrangeiro.

Examples

-- Convert an existing foreign catalog using default RESTRICT behavior
> ALTER CATALOG hms_federated_catalog DROP CONNECTION;
OK

-- Convert an existing foreign catalog using FORCE to drop foreign tables
> ALTER CATALOG hms_federated_catalog DROP CONNECTION FORCE;
OK

-- RESTRICT fails if foreign tables or views exist
> ALTER CATALOG hms_federated_catalog DROP CONNECTION RESTRICT;
[CATALOG_CONVERSION_FOREIGN_ENTITY_PRESENT] Catalog conversion from UC Foreign to UC Standard failed because catalog contains foreign entities (up to 10 are shown here): <entityNames>. To see the full list of foreign entities in this catalog, please refer to the scripts below.

-- FORCE fails if catalog type isn't supported
> ALTER CATALOG redshift_federated_catalog DROP CONNECTION FORCE;
[CATALOG_CONVERSION_UNSUPPORTED_CATALOG_TYPE] Catalog cannot be converted from UC Foreign to UC Standard. Only HMS and Glue Foreign UC catalogs can be converted to UC Standard.

Scripts para verificar tabelas e exibições estrangeiras

Observação

Antes de usar DROP CONNECTION RESTRICT, pode utilizar estes scripts Python para verificar tabelas e vistas estrangeiras no seu catálogo utilizando a API REST do Unity Catalog.

Script para listar todas as tabelas e exibições estrangeiras do catálogo federado:

import requests

def list_foreign_uc_tables_and_views(catalog_name, pat_token, workspace_url):
    """
    Lists all foreign tables and views in the specified Unity Catalog.

    Args:
        catalog_name (str): The name of the catalog to search.
        pat_token (str): Personal Access Token for Databricks API authentication.
        workspace_url (str): Databricks workspace hostname (e.g., "https://adb-xxxx.x.azuredatabricks.net").

    Returns:
        list: A list of dictionaries containing information about the foreign tables/views.
    """
    base_url = f"{workspace_url}/api/2.1/unity-catalog"
    headers = {
        "Authorization": f"Bearer {pat_token}",
        "Content-Type": "application/json"
    }

    # Step 1: List all schemas in the catalog (GET request)
    schemas_url = f"{base_url}/schemas"
    schemas_params = {
        "catalog_name": catalog_name,
        "include_browse": "true"
    }

    schemas_resp = requests.get(schemas_url, headers=headers, params=schemas_params)
    schemas_resp.raise_for_status()
    schemas = schemas_resp.json().get("schemas", [])
    schema_names = [schema["name"] for schema in schemas]

    result = []

    # Step 2: For each schema, list all tables/views and filter (GET request)
    for schema_name in schema_names:
        tables_url = f"{base_url}/table-summaries"
        tables_params = {
            "catalog_name": catalog_name,
            "schema_name_pattern": schema_name,
            "include_manifest_capabilities": "true"
        }

        tables_resp = requests.get(tables_url, headers=headers, params=tables_params)
        tables_resp.raise_for_status()
        tables = tables_resp.json().get("tables", [])

        for table in tables:
            # Use OR for filtering as specified
            if (
                table.get("table_type") == "FOREIGN"
                or table.get("securable_kind") in {
                    "TABLE_FOREIGN_HIVE_METASTORE_VIEW",
                    "TABLE_FOREIGN_HIVE_METASTORE_DBFS_VIEW"
                }
            ):
                result.append(table.get("full_name"))

    return result

# Example usage:
# catalog = "hms_foreign_catalog"
# token = "dapiXXXXXXXXXX"
# workspace = "https://adb-xxxx.x.azuredatabricks.net"
# foreign_tables = list_foreign_uc_tables_and_views(catalog, token, workspace)
# for entry in foreign_tables:
#     print(entry)

Script para listar todas as tabelas e exibições estrangeiras que estão no estado de provisionamento ATIVO:

import requests

def list_foreign_uc_tables_and_views(catalog_name, pat_token, workspace_url):
    """
    Lists all foreign tables and views in the specified Unity Catalog.

    Args:
        catalog_name (str): The name of the catalog to search.
        pat_token (str): Personal Access Token for Databricks API authentication.
        workspace_url (str): Databricks workspace hostname (e.g., "https://adb-xxxx.x.azuredatabricks.net").

    Returns:
        list: A list of dictionaries containing information about the foreign tables/views.
    """
    base_url = f"{workspace_url}/api/2.1/unity-catalog"
    headers = {
        "Authorization": f"Bearer {pat_token}",
        "Content-Type": "application/json"
    }

    # Step 1: List all schemas in the catalog (GET request)
    schemas_url = f"{base_url}/schemas"
    schemas_params = {
        "catalog_name": catalog_name,
        "include_browse": "true"
    }

    schemas_resp = requests.get(schemas_url, headers=headers, params=schemas_params)
    schemas_resp.raise_for_status()
    schemas = schemas_resp.json().get("schemas", [])
    schema_names = [schema["name"] for schema in schemas]

    result = []

    # Step 2: For each schema, list all tables/views and filter (GET request)
    for schema_name in schema_names:
        tables_url = f"{base_url}/table-summaries"
        tables_params = {
            "catalog_name": catalog_name,
            "schema_name_pattern": schema_name,
            "include_manifest_capabilities": "true"
        }

        tables_resp = requests.get(tables_url, headers=headers, params=tables_params)
        tables_resp.raise_for_status()
        tables = tables_resp.json().get("tables", [])

        for table in tables:
            # Use OR for filtering as specified
            if (
                table.get("table_type") == "FOREIGN"
                or table.get("securable_kind") in {
                    "TABLE_FOREIGN_HIVE_METASTORE_VIEW",
                    "TABLE_FOREIGN_HIVE_METASTORE_DBFS_VIEW"
                }
            ):
                table_full_name = table.get('full_name')
                get_table_url = f"{base_url}/tables/{table_full_name}"
                tables_params = {
                    "full_name": table_full_name,
                    "include_browse": "true",
                    "include_manifest_capabilities": "true"
                }

                table_resp = requests.get(get_table_url, headers=headers, params=tables_params)
                table_resp.raise_for_status()
                provisioning_info = table_resp.json().get("provisioning_info", dict()).get("state", "")

                if provisioning_info == "ACTIVE":
                    result.append(table_full_name)

    return result

# Example usage:
# catalog = "hms_foreign_catalog"
# token = "dapiXXXXXXXXXX"
# workspace = "https://adb-xxxx.x.azuredatabricks.net"
# foreign_tables = list_foreign_uc_tables_and_views(catalog, token, workspace)
# for entry in foreign_tables:
#     print(entry)