Compartilhar via


cláusula IDENTIFIER

Aplica-se a:verificação marcada como sim SQL do Databricks marca de verificação sim Databricks Runtime 13.3 LTS e versões posteriores

A cláusula IDENTIFIER permite a parametrização segura contra injeções de SQL de identificadores em instruções SQL.

  • Aplica-se a:check marked yes Databricks Runtime 18.0 e superior

    A cláusula pode ser usada em vez de qualquer nome de objeto ou identificador dentro de um nome de várias partes, desde que os argumentos consistam apenas em um literal de cadeia de caracteres ou marcador de parâmetro de cadeia de caracteres. Isso inclui cadeias de caracteres coalessadas, como: 'myschema' :table 'mycolumn' ou :schema :table :column.

  • Aplica-se a:verificação marcada como sim SQL do Databricks marca de verificação sim Databricks Runtime 13.3 LTS e versões posteriores

    A IDENTIFIER cláusula interpreta uma cadeia de caracteres constante, como 'myschema' || :table || 'mycolumn' ou :schema || :table || :column como:

    • nome da relação (tabela ou exibição)
    • nome da função
    • nome de coluna
    • nome do campo
    • nome do esquema
    • nome do catálogo

    A IDENTIFIER cláusula é limitada às seguintes instruções:

    • O nome da tabela, visualização ou função de uma instrução CREATE, ALTER, DROP ou UNDROP.
    • O nome da tabela de destino de instruções MERGE, UPDATE, DELETE, INSERT, COPY INTO.
    • O destino de uma instrução SHOW ou DESCRIBE.
    • USO de um esquema ou catálogo
    • Uma invocação de função
    • Uma coluna, uma tabela ou uma exibição referenciada em uma consulta. Isso inclui consultas inseridas em uma instrução DDL ou DML.

Observação

Quando não há suporte para a IDENTIFIER cláusula e a injeção de SQL não é uma preocupação, você pode usar EXECUTE IMMEDIATE . Por exemplo: EXECUTE IMMEDIATE 'CREATE TABLE ' || :tab || '(' || :col || 'INT)';

Sintaxe

IDENTIFIER ( strLiteral )

IDENTIFIER ( strExpr )

Parâmetros

  • strLiteral: um STRING literal normalmente composto por um ou mais marcadores de parâmetro de string e componentes literais que são coalescidos;
  • strExpr: uma expressão de constante STRING normalmente incluindo um ou mais marcadores de parâmetro. A partir do Databricks Runtime 18.0, essa notação foi preterida.

Exemplos

Scala

// Creation of a table using parameter marker.
spark.sql("CREATE TABLE IDENTIFIER(:mytab)(c1 INT)", args = Map("mytab" -> "tab1"))

// Altering a table with a fixed schema and a parameterized table name.
spark.sql("ALTER TABLE IDENTIFIER('default.' || :mytab) ADD COLUMN c2 INT)", args = Map("mytab" -> "tab1"))

// Altering a table with a fixed schema and a parameterized table name in DBR 18.0 and above.
spark.sql("ALTER TABLE IDENTIFIER('default.' :mytab) ADD COLUMN c2 INT)", args = Map("mytab" -> "tab1"))

// Dropping a table with separate schema and table parameters.
spark.sql("DROP TABLE IDENTIFIER(:myschema || '.' || :mytab)", args = Map("mySchema" -> "default", "mytab" -> "tab1"))

// Dropping a table with separate schema and table parameters in DBR 18.0 and above.
spark.sql("DROP TABLE IDENTIFIER(:myschema '.' :mytab)", args = Map("mySchema" -> "default", "mytab" -> "tab1"))

// A parameterized reference to a table in a query. The table name is qualified and uses back-ticks.
spark.sql("SELECT * FROM IDENTIFIER(:mytab)", args = Map("mytab" -> "`default`.`tab1`"))

// You cannot qualify the IDENTIFIER claue or use it as a qualifier itself.
spark.sql("SELECT * FROM myschema.IDENTIFIER(:mytab)", args = Map("mytab" -> "`tab1`"))

spark.sql("SELECT * FROM IDENTIFIER(:myschema).mytab", args = Map("mychema" -> "`default`"))

// A parameterized column reference
spark.sql("SELECT IDENTIFIER(:col) FROM VALUES(1) AS T(c1)", args = Map("col" -> "t.c1"))

// Passing in an aggregate function name as a parameter
spark.sql("SELECT IDENTIFIER(:agg)(c1) FROM VALUES(1), (2) AS T(c1)", args = Map("agg" -> "max"))

SQL


-- Using a catalog using a variable.
> DECLARE mycat = 'main';
> USE CATALOG IDENTIFIER(mycat);

-- Creation of a table using variable.
> DECLARE mytab = 'tab1';
> CREATE TABLE IDENTIFIER(mytab)(c1 INT);

-- Altering a table with a fixed schema and a parameterized table name.
> ALTER TABLE IDENTIFIER('default.' || mytab) ADD COLUMN c2 INT;

-- Altering a table with a fixed schema and a parameterized table name in DBR 18.0 and above.
> ALTER TABLE IDENTIFIER('default.' || mytab) ADD COLUMN c2 INT;

-- Inserting using a parameterized table name. The table name is qualified and uses back-ticks.
> SET VAR mytab = '`default`.`tab1`';
> INSERT INTO IDENTIFIER(mytab) VALUES(1, 2);

-- A parameterized reference to a table in a query.
> SELECT * FROM IDENTIFIER(mytab);
  1   2

-- Dropping a table with separate schema and table parameters.
> DECLARE myschema = 'default';
> SET VAR mytab = 'tab1';
> DROP TABLE IDENTIFIER(myschema || '.' || mytab);
-- In DBR 18.0 and above:
> DROP TABLE IDENTIFIER(myschema '.' mytab);

-- You cannot qualify the IDENTIFIER clause or use it as a qualifier itself prior to DBR 18.0.
> SELECT * FROM myschema.IDENTIFIER('tab');
Error: PARSE_SYNTAX_ERROR

> SELECT * FROM IDENTIFIER('default').mytab;
Error: PARSE_SYNTAX_ERROR

-- A parameterized column reference
> DECLARE col = 't.c1';
> SELECT IDENTIFIER(col) FROM VALUES(1) AS T(c1);
  1

-- Passing in an aggregate function name as a parameter
> DECLARE agg = 'max';
> SELECT IDENTIFIER(agg)(c1) FROM VALUES(1), (2) AS T(c1);
  2