Apakah ada fungsi SQL standar dengan efek samping?


11

Apakah standar SQL mendefinisikan fungsi dengan efek samping?

Sebagai contoh, apakah mereka memiliki fungsi untuk menulis ke file * atau untuk memperbarui nilai di kolom tertentu dari sebuah tabel ketika Anda melakukan sesuatu seperti

SELECT myfunction(params...);

Saya pernah melihat ini kadang-kadang, tetapi saya hanya ingin tahu apakah standar SQL melakukan hal yang sama.


* Ini bukan pertanyaan tentang PostgreSQL secara khusus. Saya hanya menggunakan contoh efek samping yang saya lihat di PostgreSQL.


Fungsinya sangat berbeda di platform yang berbeda, tapi ya, ada fungsi tambahan yang cukup standar (yaitu Oracle-disediakan) di Oracle misalnya, untuk mengirim email. Dan ada fungsi nondeterministic dalam SQL Server seperti NEWID dan RAND, dan fungsi dalam SQL Server dapat disebut prosedur diperluas juga.
Cade Roux

3
Jika pertanyaannya adalah " apakah standar SQL menyertakan fungsi yang memiliki efek samping " Saya pikir jawabannya adalah tidak. Jika pertanyaannya adalah " apakah standar SQL memungkinkan fungsi untuk ditulis yang memiliki efek samping " maka saya pikir jawabannya adalah ya.
a_horse_with_no_name

@a_horse_with_no_name, Terima kasih. Pertanyaan saya adalah yang pertama, tentang gaya dan konvensi.
tinlyx

Jawaban:


18

Anda memiliki beberapa pertanyaan berbeda di sini.

T: Apa fungsi SQL standar ANSI?

Fungsi standar ANSI adalah hal-hal seperti AVG, COUNT, MIN, MAX. Mereka dicakup dalam standar ANSI 1992 , tetapi itu adalah heck yang membosankan dan membosankan.

T: Apakah fungsi SQL standar ANSI mengubah data dalam database?

Tidak. Anda dapat menggunakannya untuk mengubah data - misalnya, saya dapat mengatakan:

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

Tetapi dengan sendirinya, hanya penggunaan AVG, COUNT, MIN, MAX, dll yang seharusnya tidak mengubah data secara permanen di dalam basis data Anda.

T: Apakah standar ANSI memungkinkan saya untuk menulis fungsi saya sendiri?

Ya, tetapi implementasi yang tepat bervariasi dari vendor ke vendor. Fungsi yang Anda tulis mungkin sesuai dengan standar bahasa ANSI, tetapi apa yang Anda lakukan di dalam fungsi Anda bisa sangat mengerikan, seperti membuat efek samping.

  • Saat mendiskusikan perilaku yang diinginkan , dimungkinkan untuk mendapatkan jawaban lintas platform.
  • Ketika membahas efek samping , ternyata tidak.

T: Dapatkah saya membuat fungsi saya sendiri untuk menulis data?

Mengapa yakin, jika Anda kreatif. Saya seorang Microsoft SQL Server, jadi saya akan fokus pada platform itu. Halaman fungsi Books Online mengatakan:

Fungsi yang ditentukan pengguna tidak dapat digunakan untuk melakukan tindakan yang mengubah keadaan basis data.

Yang saya katakan:

Anda bukan ayah kandung saya.

Jadi, inilah cara saya melanggar aturan. Peringatan: ikuti ide yang sangat buruk.

  • Dalam fungsi Anda, kueri tabel baru yang dibuat khusus untuk tujuan jahat ini, dan kemudian buat sesuatu yang mengawasi tabel untuk pernyataan pilihan, dan kemudian jalankan tindakan (Acara yang Diperpanjang, audit, atau jejak Profiler). Anda dapat menghubungkan semacam alat Rube Goldberg untuk melakukan pekerjaan berdasarkan pada pernyataan pilihan tersebut.
  • Dalam fungsinya, panggil kode CLR - heck, Anda bahkan dapat memanggil layanan web . Layanan web itu bisa mendorong data kembali ke database Anda sendiri.
  • Dalam fungsinya, panggil xp_cmdshell dan lakukan sesuatu melalui command prompt. (HT @AaronBertrand dalam komentar.)

Semua contoh ini memiliki kelemahan besar dalam bentuk kinerja dan konsistensi transaksional. Anda hanya bertanya apakah secara teoritis bisa dilakukan, dan jawabannya ada ya. Saya tidak akan pernah menggunakan salah satu dari mereka dalam kode saya sendiri - Saya akan mundur dan bertanya, "Apa tujuan bisnis yang saya coba capai di sini, dan apakah ada cara saya bisa melakukannya untuk mencapai kinerja dan konsistensi transaksional ? " Jika Anda menginginkan saran khusus untuk itu, saya akan mengajukan pertanyaan Stack terpisah dengan spesifik.


Terima kasih. Apakah PSM memungkinkan fungsi atau prosedur memiliki efek samping, mengingat standar SQL tidak?
Tim


-3

Saya hanya dapat berbicara secara definitif mengenai SQL Server, dan tampaknya ini tidak konsisten di semua implementasi basis data. Tetapi dalam SQL Server, fungsi mungkin tidak menghasilkan efek samping. Ini adalah aturan yang keras dan cepat yang telah saya coba hindari beberapa kali tanpa hasil.

Jika Anda berpikir tentang fungsi dalam pengertian umum, ada modul SQL yang memungkinkan efek samping (misalnya prosedur tersimpan) tetapi fungsi yang ditentukan pengguna tidak.

Ada pepatah "Solusi Pintar Jangan Skala" yang terutama berlaku untuk produk Microsoft. Saya telah melihat sejumlah solusi cerdas di versi awal SQL Server yang menjadi usang di versi yang lebih baru, karena MS menambahkannya sebagai fitur yang sebenarnya.

Orang-orang yang tidak pernah menjadi fitur, jujur, tidak pernah menjadi fitur karena mereka secara mendasar merusak beberapa aspek pengembangan T-SQL. Efek samping dalam fungsi adalah salah satunya.


Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Paul White 9
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.