Existem funções SQL padrão com efeitos colaterais?

11

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.

tinlyx
fonte
As funções são muito diferentes em plataformas diferentes, mas sim, existem funções complementares padrão (ou seja, fornecidas pela Oracle) no Oracle, por exemplo, para o envio de email. E existem funções não determinísticas no SQL Server, como NEWID e RAND, e funções no SQL Server também podem ser chamadas de procedimentos estendidos.
Cade Roux
3
Se a pergunta for " o padrão SQL inclui funções com efeitos colaterais ", acho que a resposta é não. Se a pergunta for " o padrão SQL permite escrever funções com efeitos colaterais ", acho que a resposta é sim.
a_horse_with_no_name
@a_horse_with_no_name, Obrigado. Minha pergunta foi a primeira, sobre estilo e convenção.
tinlyx

Respostas:

18

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:

INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales

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.

  • Ao discutir o comportamento pretendido , é possível obter uma resposta multiplataforma.
  • Ao discutir efeitos colaterais , não é.

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:

As funções definidas pelo usuário não podem ser usadas para executar ações que modificam o estado do banco de dados.

Para o qual eu digo:

Você não é meu pai de verdade.

Então, aqui está como eu violaria as regras. Atenção: idéias muito ruins seguem.

  • Em sua função, consulte uma nova tabela criada especialmente para esse propósito maléfico e, em seguida, crie algo que observe a tabela para instruções de seleção e, em seguida, inicie uma ação (Eventos Estendidos, Auditoria ou Rastreio do Profiler). Você pode conectar um tipo de dispositivo de Rube Goldberg para executar um trabalho com base nessas instruções selecionadas.
  • Na função, chame o código CLR - você pode até chamar um serviço da web . Esse serviço da Web pode muito bem enviar dados de volta para seu próprio banco de dados.
  • Na função, chame xp_cmdshell e faça algo através do prompt de comando. (HT @AaronBertrand nos comentários.)

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.

Brent Ozar
fonte
Obrigado. O PSM permite que uma função ou procedimento tenha efeito colateral, considerando que o padrão SQL não?
Tim
-3

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.

Matthew Sontum
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Paul White 9