Os padrões SQL definem funções com efeitos colaterais?
Por exemplo, eles têm funções para gravar em arquivos * ou atualizar valores em determinadas colunas de uma tabela quando você faz algo como
SELECT myfunction(params...);
Já vi isso algumas vezes, mas estou curioso para saber se os padrões SQL fazem o mesmo.
* Esta não é uma pergunta sobre o PostgreSQL especificamente. Estou apenas usando os exemplos de efeitos colaterais que vejo no PostgreSQL.
functions
sql-standard
tinlyx
fonte
fonte
Respostas:
Você tem algumas perguntas diferentes aqui.
P: Quais são as funções SQL padrão do ANSI?
As funções padrão ANSI são AVG, COUNT, MIN, MAX. Eles são cobertos pelo padrão ANSI de 1992 , mas essa é uma leitura seca e chata.
P: As funções SQL padrão ANSI alteram os dados no banco de dados?
Não. Você pode usá-los para alterar dados - por exemplo, posso dizer:
Mas, por si só, apenas o uso de um AVG, COUNT, MIN, MAX, etc, não deve alterar os dados permanentemente no seu banco de dados.
P: O padrão ANSI permite que eu escreva minhas próprias funções?
Sim, mas a implementação exata varia de fornecedor para fornecedor. As funções que você escreve podem estar em conformidade com o padrão de linguagem ANSI, mas o que você faz dentro da sua função pode ser horrivelmente horrível, como a criação de efeitos colaterais.
P: Posso criar minha própria função para gravar dados?
Com certeza, se você é criativo. Eu sou um cara do Microsoft SQL Server, então vou me concentrar nessa plataforma. A página de função do Books Online diz:
Para o qual eu digo:
Então, aqui está como eu violaria as regras. Atenção: idéias muito ruins seguem.
Todos esses exemplos têm enormes desvantagens na forma de desempenho e consistência transacional. Você acabou de perguntar se isso poderia ser feito teoricamente e a resposta é sim. Eu nunca usaria nenhum desses no meu próprio código - eu recuaria e perguntaria: "Qual é o objetivo de negócios que estou tentando alcançar aqui e existe uma maneira de fazê-lo para obter desempenho e consistência transacional? ? " Se você quiser um conselho específico sobre isso, faça uma pergunta separada sobre a pilha com detalhes.
fonte
Só posso falar definitivamente sobre o SQL Server e parece que isso não é consistente em todas as implementações de banco de dados. Mas no SQL Server, funções podem não produzir efeitos colaterais. Esta é uma regra difícil e rápida que tentei contornar várias vezes sem sucesso.
Se você está pensando em funções no sentido geral, existem módulos SQL que permitem efeitos colaterais (por exemplo, procedimentos armazenados), mas funções definidas pelo usuário não.
Existe um ditado "Soluções inteligentes não escaláveis", o que é especialmente verdade nos produtos da Microsoft. Eu já vi várias soluções inteligentes nas versões anteriores do SQL Server que se tornaram obsoletas nas versões posteriores, porque a Microsoft as adicionou como recursos verdadeiros.
Aqueles que nunca se tornaram recursos, honestamente, nunca se tornaram recursos porque, fundamentalmente, quebraram algum aspecto do desenvolvimento do T-SQL. Os efeitos colaterais nas funções são um deles.
fonte