Esistono funzioni SQL standard con effetti collaterali?


11

Gli standard SQL definiscono le funzioni con effetti collaterali?

Ad esempio, hanno funzioni per scrivere in file * o per aggiornare i valori in determinate colonne di una tabella quando fai qualcosa del genere

SELECT myfunction(params...);

Li ho visti a volte, ma sono solo curioso di sapere se gli standard SQL fanno lo stesso.


* Questa non è una domanda specifica su PostgreSQL. Sto solo usando gli esempi di effetti collaterali che vedo in PostgreSQL.


Le funzioni sono molto diverse in piattaforme diverse, ma sì, ci sono funzioni aggiuntive abbastanza standard (cioè fornite da Oracle) in Oracle, ad esempio, per l'invio di e-mail. E ci sono funzioni non deterministiche in SQL Server come NEWID e RAND, e anche le funzioni in SQL Server possono essere chiamate procedure estese.
Cade Roux,

3
Se la domanda è " lo standard SQL include funzioni che hanno effetti collaterali " Penso che la risposta sia no. Se la domanda è " lo standard SQL consente di scrivere funzioni con effetti collaterali ", penso che la risposta sia sì.
a_horse_with_no_name

@a_horse_with_no_name, grazie. La mia domanda era la prima, sullo stile e le convenzioni.
Tinlyx,

Risposte:


18

Hai alcune domande diverse qui.

D: Cosa sono le funzioni SQL standard ANSI?

Le funzioni standard ANSI sono cose come AVG, COUNT, MIN, MAX. Sono coperti dallo standard ANSI del 1992 , ma è un diavolo di una lettura secca e noiosa.

D: Le funzioni SQL standard ANSI modificano i dati nel database?

No. Puoi usarli per modificare i dati - ad esempio, posso dire:

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

Ma da soli, solo l'uso di un AVG, COUNT, MIN, MAX, ecc. Non dovrebbe modificare i dati in modo permanente all'interno del database.

D: Lo standard ANSI mi consente di scrivere le mie funzioni?

Sì, ma l'implementazione esatta varia da fornitore a fornitore. Le funzioni che scrivi possono essere conformi allo standard del linguaggio ANSI, ma ciò che fai all'interno della tua funzione può essere terribilmente terribile, come creare effetti collaterali.

  • Quando si discute del comportamento previsto , è possibile ottenere una risposta multipiattaforma.
  • Quando si parla di effetti collaterali , non lo è.

D: Posso creare la mia funzione per scrivere dati?

Perché sicuro, se sei creativo. Sono un ragazzo di Microsoft SQL Server, quindi mi concentrerò su quella piattaforma. La pagina delle funzioni di Books Online dice:

Le funzioni definite dall'utente non possono essere utilizzate per eseguire azioni che modificano lo stato del database.

A cui dico:

Non sei il mio vero papà.

Quindi ecco come infrangerei le regole. Attenzione: seguono idee pessime.

  • Nella tua funzione, esegui una query su una nuova tabella creata appositamente per questo scopo malvagio, quindi crea qualcosa che controlla la tabella per le istruzioni selezionate e quindi attiva un'azione (Eventi estesi, controllo o traccia di Profiler). È possibile collegare un tipo di aggeggio Rube Goldberg per eseguire lavori basati su tali istruzioni selezionate.
  • Nella funzione, chiama il codice CLR - diamine, puoi persino chiamare un servizio web . Quel servizio web potrebbe benissimo riportare i dati nel tuo database.
  • Nella funzione, chiama xp_cmdshell e fai qualcosa tramite il prompt dei comandi. (HT @AaronBertrand nei commenti.)

Tutti questi esempi presentano enormi svantaggi sotto forma di prestazioni e coerenza transazionale. Hai appena chiesto se teoricamente si potesse fare, e la risposta è sì. Non userei mai nessuno dei due nel mio codice - farei un passo indietro e chiederò: "Qual è l'obiettivo aziendale che sto cercando di raggiungere qui, e c'è un modo per farlo per ottenere prestazioni e coerenza transazionale ?" Se desideri consigli specifici su questi, farei una domanda Stack separata con specifiche.


Grazie. PSM consente a una funzione o procedura di avere effetti collaterali, dato che lo standard SQL no?
Tim


-3

Posso solo parlare in modo definitivo di SQL Server e sembra che ciò non sia coerente in tutte le implementazioni del database. Ma in SQL Server, le funzioni potrebbero non produrre effetti collaterali. Questa è una regola dura e veloce che ho provato a eludere diverse volte senza successo.

Se stai pensando a funzioni in senso generale, ci sono moduli SQL che consentono effetti collaterali (ad esempio procedure memorizzate) ma le funzioni definite dall'utente non lo fanno.

C'è un detto "Clever Solutions Don't Scale" che è particolarmente vero con i prodotti Microsoft. Ho visto una serie di soluzioni intelligenti nelle prime versioni di SQL Server che sono diventate obsolete nelle versioni successive, perché MS le ha aggiunte come funzionalità reali.

Quelle che non sono mai diventate funzionalità, onestamente, non sono mai diventate funzionalità perché hanno sostanzialmente rotto alcuni aspetti dello sviluppo di T-SQL. Gli effetti collaterali nelle funzioni sono uno di questi.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Paul White 9
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.