Có các hàm SQL tiêu chuẩn với các tác dụng phụ không?


11

Các tiêu chuẩn SQL có định nghĩa các hàm với các tác dụng phụ không?

Ví dụ: chúng có các hàm để ghi vào tệp * hoặc để cập nhật giá trị trong các cột nhất định của bảng khi bạn thực hiện một số thứ như

SELECT myfunction(params...);

Đôi khi tôi đã nhìn thấy những điều này, nhưng tôi chỉ tò mò liệu các tiêu chuẩn SQL có làm như vậy không.


* Đây không phải là một câu hỏi về PostgreSQL cụ thể. Tôi chỉ sử dụng các ví dụ về tác dụng phụ mà tôi thấy trong PostgreSQL.


Các hàm rất khác nhau trong các nền tảng khác nhau, nhưng vâng, có các hàm bổ trợ khá chuẩn (ví dụ do Oracle cung cấp) trong Oracle chẳng hạn, để gửi email. Và có các hàm không xác định trong SQL Server như NEWID và RAND, và các hàm trong SQL Server cũng có thể được gọi là các thủ tục mở rộng.
Cade Roux

3
Nếu câu hỏi là " tiêu chuẩn SQL có bao gồm các hàm tác dụng phụ không " thì tôi nghĩ câu trả lời là không. Nếu câu hỏi là " tiêu chuẩn SQL có cho phép các hàm được viết có tác dụng phụ không " thì tôi nghĩ câu trả lời là có.
a_horse_with_no_name

@a_horse_with_no_name, Cảm ơn. Câu hỏi của tôi là trước đây, về phong cách và quy ước.
tinlyx

Câu trả lời:


18

Bạn có một vài câu hỏi khác nhau ở đây.

H: Các hàm SQL tiêu chuẩn ANSI là gì?

Các chức năng tiêu chuẩn ANSI là những thứ như AVG, COUNT, MIN, MAX. Chúng được bao phủ trong tiêu chuẩn ANSI năm 1992 , nhưng đó là một cách đọc khô khan, nhàm chán.

Hỏi: Các hàm SQL chuẩn ANSI có thay đổi dữ liệu trong cơ sở dữ liệu không?

Không. Bạn có thể sử dụng chúng để thay đổi dữ liệu - ví dụ: tôi có thể nói:

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

Nhưng bản thân họ, chỉ nên sử dụng AVG, COUNT, MIN, MAX, v.v. không nên thay đổi dữ liệu vĩnh viễn trong cơ sở dữ liệu của bạn.

H: Tiêu chuẩn ANSI có cho phép tôi viết các chức năng của riêng mình không?

Có, nhưng việc thực hiện chính xác khác nhau tùy theo nhà cung cấp. Các chức năng bạn viết có thể phù hợp với tiêu chuẩn ngôn ngữ ANSI, nhưng những gì bạn làm bên trong chức năng của mình có thể khủng khiếp khủng khiếp, như tạo ra các hiệu ứng phụ.

  • Khi thảo luận về hành vi dự định , có thể nhận được câu trả lời đa nền tảng.
  • Khi thảo luận về tác dụng phụ , nó không phải là.

Q: Tôi có thể tạo chức năng của riêng mình để ghi dữ liệu không?

Tại sao chắc chắn, nếu bạn sáng tạo. Tôi là một người dùng Microsoft SQL Server, vì vậy tôi sẽ tập trung vào nền tảng đó. Trang chức năng của Books Online cho biết:

Các hàm do người dùng định nghĩa không thể được sử dụng để thực hiện các hành động sửa đổi trạng thái cơ sở dữ liệu.

Tôi nói:

Bạn không phải là người cha thực sự của tôi.

Vì vậy, đây là cách tôi phá vỡ các quy tắc. Cảnh báo: ý tưởng rất xấu theo sau.

  • Trong chức năng của bạn, truy vấn một bảng mới được tạo đặc biệt cho mục đích xấu này và sau đó tạo một cái gì đó theo dõi bảng để chọn các câu lệnh và sau đó thực hiện một hành động (Sự kiện mở rộng, kiểm toán hoặc theo dõi Profiler). Bạn có thể kết hợp một loại cỗ máy Rube Goldberg để thực hiện công việc dựa trên những tuyên bố được chọn đó.
  • Trong hàm, gọi mã CLR - heck, bạn thậm chí có thể gọi một dịch vụ web . Dịch vụ web đó rất có thể đẩy dữ liệu trở lại cơ sở dữ liệu của riêng bạn.
  • Trong hàm, gọi xp_cmdshell và làm một cái gì đó thông qua dấu nhắc lệnh. (HT @AaronBertrand trong các bình luận.)

Tất cả các ví dụ này có nhược điểm rất lớn ở dạng hiệu suất và tính nhất quán trong giao dịch. Bạn chỉ cần hỏi về mặt lý thuyết có thể được thực hiện, và câu trả lời là có. Tôi sẽ không bao giờ sử dụng một trong những thứ đó trong mã của riêng mình - Tôi lùi lại và hỏi, "Mục tiêu kinh doanh tôi đang cố gắng đạt được ở đây là gì và có cách nào để tôi đạt được hiệu suất và tính nhất quán trong giao dịch ? " Nếu bạn muốn tư vấn cụ thể về những điều đó, tôi sẽ hỏi một câu hỏi Stack riêng với chi tiết cụ thể.


Cảm ơn. PSM có cho phép một chức năng hoặc thủ tục có tác dụng phụ hay không, với điều kiện là tiêu chuẩn SQL không?
Tim


-3

Tôi chỉ có thể nói một cách dứt khoát về SQL Server và có vẻ như điều này không nhất quán trong tất cả các triển khai cơ sở dữ liệu. Nhưng trong SQL Server, các chức năng có thể không tạo ra tác dụng phụ. Đây là một quy tắc khó và nhanh, tôi đã cố gắng lách một số lần mà không thành công.

Nếu bạn đang nghĩ về các hàm theo nghĩa chung, có các mô-đun SQL cho phép các hiệu ứng phụ (ví dụ các thủ tục được lưu trữ) nhưng các hàm do người dùng định nghĩa thì không.

Có một câu nói "Giải pháp không quy mô thông minh" đặc biệt đúng với các sản phẩm của Microsoft. Tôi đã thấy một số cách giải quyết thông minh trong các phiên bản đầu tiên của SQL Server đã trở nên lỗi thời trong các phiên bản sau, bởi vì MS đã thêm chúng vào như các tính năng thực sự.

Những thứ không bao giờ trở thành tính năng, một cách trung thực, không bao giờ trở thành tính năng vì về cơ bản chúng đã phá vỡ một số khía cạnh của sự phát triển T-SQL. Tác dụng phụ trong chức năng là một trong số đó.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.