Partilhar via


IDENTIFIER cláusula

Aplica-se a:Marque Sim Databricks SQL Marque Sim Databricks Runtime 13.3 LTS e superior

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

  • Aplica-se a:marcado como sim Runtime Databricks 18.0 e superiores

    A cláusula pode ser usada em vez de qualquer nome de objeto ou identificador dentro de um nome multiparte, desde que os argumentos consistam apenas num literal de cadeia ou num marcador de parâmetro de cadeia. Isto inclui cordas coalescidas como: 'myschema' :table 'mycolumn' ou :schema :table :column.

  • Aplica-se a:Marque Sim Databricks SQL Marque Sim Databricks Runtime 13.3 LTS e superior

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

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

    A IDENTIFIER cláusula limita-se às seguintes afirmações:

    • O nome do objeto da tabela, vista ou função em uma instrução CREATE, ALTER, DROP ou UNDROP.
    • O nome da tabela de destino das instruções MERGE, UPDATE, DELETE, INSERT, COPY INTO.
    • O alvo de uma declaração MOSTRAR ou DESCREVER.
    • UTILIZAÇÃO de um esquema ou catálogo
    • Uma invocação de função
    • Uma coluna, tabela ou vista referenciada numa consulta. Isso inclui consultas incorporadas em uma instrução DDL ou DML.

Observação

Quando a cláusula IDENTIFIER não é suportada e a injeção de SQL não é uma preocupação, pode-se usar EXECUTE IMMEDIATE em vez disso. Por exemplo: EXECUTE IMMEDIATE 'CREATE TABLE ' || :tab || '(' || :col || 'INT)';

Sintaxe

IDENTIFIER ( strLiteral )

IDENTIFIER ( strExpr )

Parâmetros

  • strLiteral: Um literal tipicamente composto por um ou mais marcadores de parâmetros de texto e componentes literais que são fundidos;
  • strExpr: Uma expressão constante STRING que normalmente inclui um ou mais marcadores de parâmetro. A partir do Databricks Runtime 18.0, esta notação está obsoleta.

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