DROP CONNECTION (wykaz obcy)

Dotyczy:zaznaczone jako tak Databricks SQL zaznaczone jako tak Databricks Runtime 17.3 lub nowszy

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej i jest obecnie dostępna tylko dla uczestniczących klientów. Aby wziąć udział w wersji zapoznawczej, aplikuj, wypełniając ten formularz. Ta funkcja obsługuje tylko zrywanie połączenia dla zagranicznych katalogów przy użyciu Hive Metastore (HMS) i Glue Federation.

Użyj polecenia DROP CONNECTION, aby przekonwertować wykaz obcy na standardowy katalog w "Unity Catalog". Po usunięciu połączenia wykaz nie synchronizuje już tabel obcych z wykazu zewnętrznego. Zamiast tego działa jak standardowy katalog Unity Catalog, zawierający zarządzane lub zewnętrzne tabele. Katalog jest teraz oznaczony jako standardowy zamiast obcy w Unity Catalog. To polecenie nie wpływa na tabele w zdalnym katalogu; wpływa tylko na Unity Catalog.

Wymaga OWNER lub MANAGE, USE_CATALOG oraz BROWSE uprawnień w wykazie.

Składnia

ALTER CATALOG catalog_name DROP CONNECTION { RESTRICT | FORCE }

Parametry

  • catalog_name

    Nazwa wykazu obcego, który ma być konwertowany na wykaz standardowy.

  • OGRANICZENIE

    Domyślne zachowanie. DROP CONNECTION kończy się niepowodzeniem podczas konwertowania katalogu obcego na katalog standardowy, jeśli w katalogu znajdują się jakiekolwiek obce tabele lub obce widoki.

    Aby uaktualnić tabele obce do tabel zarządzanych lub zewnętrznych w wykazie aparatu Unity, zobacz Tabele obce przy użyciu języka SQL lub Konwertowanie tabeli obcej na zewnętrzną tabelę wykazu aparatu Unity. Aby przekonwertować widoki obce, zobacz SET MANAGED (WIDOK OBCY).

  • SIŁA

    DROP CONNECTION z porzuceniem FORCE pozostałych tabel obcych lub widoków w wykazie obcym podczas konwertowania wykazu obcego na standardowy wykaz. To polecenie nie usuwa żadnych danych ani metadanych w katalogu zewnętrznym; usuwa tylko metadane zsynchronizowane z Unity Catalog w celu utworzenia tabeli odwołaniowej.

    Ostrzeżenie

    Nie można wycofać tego polecenia. Jeśli chcesz zintegrować zagraniczne tabele z powrotem do Unity Catalog, musisz ponownie utworzyć obcy katalog.

Przykłady

-- 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.

Skrypty do sprawdzania obcych tabel i widoków

Uwaga / Notatka

Przed użyciem DROP CONNECTION RESTRICT, można użyć tych skryptów języka Python do sprawdzania zewnętrznych tabel i widoków w katalogu Unity przy użyciu interfejsu API REST.

Skrypt umożliwiający wyświetlenie listy wszystkich obcych tabel i widoków z wykazu federacyjnego:

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)

Skrypt umożliwiający wyświetlenie listy wszystkich obcych tabel i widoków, które są w stanie aktywnej aprowizacji:

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)