где используется список - Запрос информации метаданных Снежинки - PullRequest
2 голосов
/ 03 февраля 2020

Есть ли способ запросить метаданные DDL, чтобы получить список представлений, используя таблицу? или список представлений, использующих другое представление et c?

т.е. где используется список таблицы или представления по различным схемам.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Как отметил Сахадж в своем ответе, нет прямого способа выбрать имена всех представлений, используя таблицу. Вы можете создать хранимую процедуру для извлечения этой информации, используя GET_OBJECT_REFERENCES, однако с оговоркой, что это будет довольно медленно, если у вас есть значительное количество объектов в вашей базе данных:

-- Finds all references to the table with the provided name in the
-- active database. Returns them as a comma-separated list.
CREATE OR REPLACE PROCEDURE GetTableReferences(DATABASE_NAME VARCHAR, SCHEMA_NAME VARCHAR, TABLE_NAME VARCHAR)
RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$
var query = "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG = '" + DATABASE_NAME + "'";
var statement = snowflake.createStatement( {sqlText: query} );
var result_set = statement.execute();
var matches = '';
while (result_set.next())  {
  var schema = result_set.getColumnValue(1);
  var table = result_set.getColumnValue(2);
  var object_references_query =
    "SELECT 1 FROM TABLE(GET_OBJECT_REFERENCES(DATABASE_NAME => '" + DATABASE_NAME
    + "', SCHEMA_NAME => '" + schema + "', OBJECT_NAME => '" + table + "')) WHERE REFERENCED_SCHEMA_NAME = '"
    + SCHEMA_NAME + "' AND REFERENCED_OBJECT_NAME = '" + TABLE_NAME + "'";
  var object_references_statement = snowflake.createStatement( {sqlText: object_references_query} );
  try {
    if (object_references_statement.execute().next()) {
      // This is a match
      if (matches.length !== 0) {
        matches += ",";
      }
      matches += schema + "." + table;
    }
  } catch (err) {
    // Ignore invalid views.
  }
}
return matches;
$$;

CALL GetTableReferences('MY_DATABASE_NAME', 'MY_SCHEMA_NAME', 'MY_TABLE_NAME');
3 голосов
/ 03 февраля 2020

К сожалению, нет. Однако Snowflake предлагает GET_OBJECT_REFERENCES (), который возвращает список объектов, на которые ссылается указанное представление. Вы можете материализовать результаты этой функции для всех представлений, а затем выполнить обратный поиск для ссылок на сущности для конкретной таблицы / представления.

https://docs.snowflake.net/manuals/sql-reference/functions/get_object_references.html

...