Tại sao bạn muốn tránh SQL động trong thủ tục được lưu trữ?


13

Tôi đã nghe một người nói rằng bạn không muốn sử dụng SQL động. Bạn có thể đưa ra một số ví dụ cụ thể hoặc ví dụ thực tế? Cá nhân, tôi mã nó một vài lần trong cơ sở dữ liệu của tôi. Tôi nghĩ nó ổn vì nó linh hoạt. Tôi đoán là về SQL Injection hoặc Performance. Còn gì nữa không?

Câu trả lời:


7

Không có gì sai khi sử dụng SQL động nếu bạn phải. Trong thực tế trong một số trường hợp, đó là lựa chọn duy nhất mà bạn có. Chúng tôi khuyên bạn không nên sử dụng nó vì có, nó có thể dẫn đến việc tiêm SQL nếu đầu vào của bạn không được vệ sinh và có sử dụng SQL động trong các mô-đun thường được gọi là có thể gây bất lợi cho hiệu suất của nó.

Tôi không nghĩ có một ví dụ cụ thể như mọi người nhưng tôi sẽ nói thế này: Hãy cố gắng đạt được những gì bạn đang có sau khi sử dụng các truy vấn và câu lệnh thông thường trước - chỉ sau đó khi bạn đã sử dụng hết tất cả các con đường khác. Chỉ cần nhớ rằng việc thực thi một chuỗi SQL động được thực hiện trong một phiên người dùng riêng cho mô đun đang gọi nó - vì vậy bạn có thể gặp phải các vấn đề về quyền mà bạn không mong đợi.

Nếu bạn lo lắng về hiệu suất; kiểm tra nó Nếu bạn lo lắng về bảo mật; xác nhận đầu vào của bạn. Không có đúng hay sai - chỉ có điều bạn sử dụng phán đoán tốt nhất của mình dựa trên thông tin và công cụ bạn có sẵn tại thời điểm đó.


5

SQL động là một công cụ. Và như một công cụ, nó có một số ứng dụng - ví dụ, đối với các công việc hành chính, đó là một phước lành.

Không tốt cho SP được các ứng dụng sử dụng, đặc biệt là nếu bạn không quản lý việc tham số hóa mã được tạo (phiên bản mới nhất của SQL Server đã giảm các vấn đề, nhưng vẫn hợp lệ).

Tôi sẽ không nhập chi tiết ở đây, vì vậy tôi sẽ đề xuất một bài viết xuất sắc về các vấn đề SQL động: Lời nguyền và phước lành của SQL động của MVP Erland Sommarskog.


1
Tôi cũng sẽ chia sẻ liên kết đó, nó phải đọc cho bất cứ ai xem xét sử dụng SQL động.
HLGEM

1

Nó giống như hầu hết các tính năng dbms, nếu bạn sử dụng nó trong tình huống phù hợp thì nó hoạt động tốt, tình huống sai thì nó hoạt động kém.

Ưu điểm: Một số điều không thể được thực hiện mà không có nó. Thông thường tôi chỉ thấy điều này là dành cho công việc hành chính, và không phải mã ứng dụng. Một số lệnh hệ thống không cho phép các tham số được sử dụng làm đầu vào. Vì vậy, ví dụ nếu tôi cần chạy một cái gì đó thông qua một cơ sở dữ liệu đối với mọi cơ sở dữ liệu, trong nhiều trường hợp với cơ sở dữ liệu không xác định và lệnh không chấp nhận tham số, tôi thường giải quyết vấn đề này thông qua SQL động. Tuy nhiên, đây là một điều trong Sybase ASE hơn là MSSQL.

Nhược điểm: Tôi sẽ không đi sâu vào nó, vì tôi nghĩ rằng tất cả chúng ta đều đã biết, nhưng có thể có một số rủi ro đối với việc tiêm SQL nếu nó được sử dụng không chính xác. Điều lớn hơn với tôi là truy vấn sẽ được xử lý như nó là gì, một truy vấn adhoc duy nhất và không phải là một phần của kế hoạch truy vấn được biên dịch. Đối với một cái gì đó chạy đôi khi, không có vấn đề lớn. Đối với một cái gì đó được thực hiện hàng trăm lần một phút và sẽ có rất nhiều sql duy nhất, nó sẽ tạo ra rất nhiều kế hoạch truy vấn mới, có thể không cần thiết, ăn hết chu kỳ và rút ngắn thời gian hợp lệ của bộ đệm của kế hoạch.


Một ứng dụng tuyệt vời được sử dụng trong Sybase ASE là pivots mà không biết các giá trị được xoay vòng. Điều này có thể được thực hiện bằng cách sử dụng SQL động trong một Proc được lưu trữ, nhưng theo tôi biết Sybase ASE không hỗ trợ cú pháp để thực hiện điều này trực tiếp như một truy vấn. Chỉ khi biết các giá trị, truy vấn mới có thể được ghi để xoay vòng dữ liệu.
richardcrossley

-7

Không sử dụng SQL động.

99% thời gian SQL động được sử dụng do thiếu kiến ​​thức về cách sử dụng các tham số tùy chọn trong quy trình được lưu trữ, 1% thời gian còn lại được sử dụng để tạo truy vấn rất phức tạp cho báo cáo mà khách hàng không hiểu cũng. Lời nguyền và phước lành của SQL động không cho thấy một ví dụ về lý do tại sao nên sử dụng nó, thay vào đó chỉ gợi ý rằng nó có vấn đề vì nó làm tăng sự phức tạp trong việc gỡ lỗi, duy trì, không đề cập đến các rủi ro bảo mật của SQL Tiêm, hiệu năng kém không phải vì bộ nhớ cache mà là các thực tiễn xấu đi kèm với nó như sử dụng các bảng và con trỏ tạm thời , tất nhiên là lười biếngngây thơlập trình viên sẽ lạm dụng. Không có gì linh hoạt để viết các truy vấn theo cách đó, SQL là ngôn ngữ khai báo và nó nên được xử lý như vậy.

Lười biếng là gốc rễ của mọi tội lỗi.

Nghịch lý là câu trả lời này sẽ được xếp hạng trong những người bị đánh giá thấp nhất .


Trên thực tế, bài viết này cung cấp ít nhất một ví dụ về trường hợp sử dụng lý tưởng cho SQL động và "không có gì linh hoạt để viết các truy vấn theo cách đó ..." là không đúng - SQL động chính xác là điều cho phép điều này Uyển chuyển.
LowlyDBA

Thông số tùy chọn? Bạn có nghĩa là antipotype?
Forrest

@LowlyDBA Bài viết cung cấp ít nhất một ví dụ: CHỌN đơn giản nhất từng thấy, giải quyết vấn đề phức tạp nào? và cho sự linh hoạt, vâng, cho những lập trình viên ngây thơ.
Ivanzinho

@Forrest tại sao bạn gọi nó là "antipotype"? bởi vì liên kết bạn cung cấp không bao giờ nói điều đó và cũng không bao giờ cho thấy mức độ cải thiện đã được thực hiện sau khi logic được viết lại thành SQL động (trong trường hợp này sẽ không đáng kể so với hiệu ứng quả cầu tuyết của việc duy trì truy vấn đó cuối cùng sẽ xảy ra)
Ivanzinho

Đây là một ý kiến ​​(nghèo) dựa trên câu trả lời IMHO. Bạn chưa cung cấp các ví dụ cụ thể về các vấn đề mà bạn mô tả, cũng như bạn chưa xác định nguyên tắc sử dụng SQL động
George.Palacios
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.