Comandos DML e CTAS: possibilidade de resultados errados quando a propriedade RELY é definida (pendente)¶
Atenção
Essa mudança de comportamento está no pacote 2025_03.
Para saber o status atual do pacote, consulte Histórico do pacote.
Quando esse pacote de mudança de comportamento está ativado, uma otimização em determinadas instruções DML e CTAS pode produzir resultados errados quando a propriedade RELY é definida na tabela de destino:
- Antes da mudança:
As instruções DML e CTAS em tabelas com restrições UNIQUE e PRIMARY KEY não se qualificam para uma otimização aplicada às operações DISTINCT e GROUP BY. (O otimizador remove as colunas de agrupamento redundantes)
Como a otimização em questão é atualmente aplicada somente às instruções SELECT, ela não apresenta risco de que dados incorretos possam ser inseridos se a propriedade RELY for definida para uma restrição e ocorrer uma violação da integridade referencial.
- Após a mudança:
As instruções DML e CTAS em tabelas com restrições UNIQUE e PRIMARY KEY agora se qualificam para a mesma otimização aplicada às instruções SELECT.
Se a propriedade RELY for definida para uma restrição e ocorrer uma violação da integridade referencial, poderão ser inseridos dados incorretos.
Informações básicas¶
O Snowflake não impõe a integridade referencial em tabelas padrão, independentemente das restrições e propriedades que o senhor definir. (A exceção a essa regra são as tabelas híbridas, em que certas restrições são exigidas e aplicadas)
A propriedade de restrição RELY declara que você acredita que os dados da tabela têm integridade referencial (ou que outro aplicativo a está impondo antes de os dados serem carregados no Snowflake). A propriedade RELY deve ser definida explicitamente e não é ativada por padrão. Já está documentado que a definição dessa propriedade pode levar a um comportamento não intencional e/ou a resultados inesperados.
Identificação de tabelas com a propriedade de restrição RELY¶
Para descobrir quais tabelas têm a propriedade RELY definida para as restrições PRIMARY KEY ou UNIQUE, execute esta consulta:
SELECT table_schema, table_name
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE RELY ='YES'
AND (constraint_type = 'PRIMARY KEY' OR constraint_type = 'UNIQUE');
Considere descartar as restrições ou não definir a propriedade RELY se você prevê algum problema quando a otimização entrar em vigor.
Ref: 1902