Một số quan sát
Các thủ tục lưu trữ cung cấp cho bạn tái sử dụng mã và đóng gói (hai trụ cột của phát triển phần mềm),
Chỉ khi bạn sử dụng chúng một cách chính xác trong bối cảnh mà chúng được sử dụng. Yêu cầu tương tự có thể được nói về các hàm (trong lập trình có cấu trúc) hoặc các phương thức (trong lập trình hướng đối tượng), tuy nhiên, chúng ta thấy các hàm 1K và các đối tượng mega-ass.
Cổ vật không cung cấp cho bạn những lợi ích. Việc sử dụng hợp lý những đồ tạo tác đó là những gì mang lại những lợi ích đó.
bảo mật (bạn có thể cấp / thu hồi quyền trên một Proc được lưu trữ riêng lẻ),
Đúng. Đây là một điểm tốt và một trong những lý do chính tôi thích các thủ tục được lưu trữ. Chúng cung cấp một điều khiển truy cập chi tiết hơn so với những gì có thể đạt được thông thường chỉ bằng các lượt xem và tài khoản người dùng.
bảo vệ bạn khỏi các cuộc tấn công SQL,
Điều đó không cụ thể đối với SP vì bạn có thể đạt được mức bảo vệ tương tự với các câu lệnh SQL được tham số hóa và quá trình lọc đầu vào. Tôi sẽ sử dụng SP ngoài những SP đó, tuy nhiên, là vấn đề "bảo mật chuyên sâu" .
và cũng giúp tốc độ (mặc dù DBA nói rằng bắt đầu với SQL Server 2008, ngay cả các truy vấn SQL thông thường cũng được biên dịch nếu chúng chạy đủ thời gian).
Đây là cơ sở dữ liệu cụ thể của nhà cung cấp, nhưng nói chung DBA của bạn là đúng. Các câu lệnh SQL (tĩnh hoặc tham số hóa) được biên dịch. SP giúp đỡ nếu bạn muốn / cần tổng hợp và tính toán dữ liệu mà bạn không thể làm với các câu lệnh SQL đơn giản, nhưng được tích hợp chặt chẽ với SQL và không đảm bảo chuyến đi khứ hồi đến máy chủ ứng dụng.
Một ví dụ điển hình là truy vấn dữ liệu vào một con trỏ tạm thời (hoặc con trỏ) để chạy SQL khác. Bạn có thể thực hiện lập trình trong máy chủ ứng dụng hoặc bạn có thể lưu nhiều chuyến đi khứ hồi bằng cách thực hiện trong db.
Điều này không phải là tiêu chuẩn, tuy nhiên. Nếu bạn có nhiều trường hợp như vậy, thì đó là dấu hiệu của thiết kế cơ sở dữ liệu xấu (hoặc bạn đang lấy dữ liệu từ các lược đồ cơ sở dữ liệu không tương thích giữa các phòng ban.)
Chúng tôi đang phát triển một ứng dụng phức tạp bằng phương pháp phát triển phần mềm Agile.
Agility phải làm với các quy trình kỹ thuật phần mềm và quản lý yêu cầu, chứ không phải công nghệ.
Bất cứ ai cũng có thể nghĩ ra những lý do chính đáng tại sao họ không muốn sử dụng các procs được lưu trữ?
Câu hỏi sai
Câu hỏi sai và tương đương với câu hỏi "có lý do chính đáng nào để không sử dụng GOTO" không? Tôi bên cạnh Niklaus Wirth nhiều hơn với Dijkstra về chủ đề này. Tôi có thể hiểu tình cảm của Dijkstra đến từ đâu, nhưng tôi không tin rằng nó có thể áp dụng 100% trong mọi trường hợp. Tương tự với procs cửa hàng và bất kỳ công nghệ.
Một công cụ tốt khi được sử dụng tốt cho mục đích của nó và khi đó là công cụ tốt nhất cho nhiệm vụ cụ thể. Sử dụng nó không phải là một dấu hiệu cho thấy công cụ này sai, nhưng người sử dụng không biết mình đang làm gì.
Câu hỏi thích hợp là "loại mô hình sử dụng thủ tục được lưu trữ nào nên tránh." Hoặc, "trong những điều kiện tôi nên (hoặc không nên) sử dụng các thủ tục được lưu trữ" . Tìm kiếm lý do không sử dụng công nghệ chỉ đơn giản là đổ lỗi cho công cụ thay vì đặt trách nhiệm kỹ thuật thẳng vào nơi nó thuộc về - trong kỹ sư.
Nói cách khác, đó là một cảnh sát hoặc tuyên bố thiếu hiểu biết.
Tôi đoán là các DBA không muốn duy trì các procs được lưu trữ đó, nhưng dường như có quá nhiều tiêu cực để biện minh cho một quyết định thiết kế như vậy.
Những gì họ đang làm sau đó là dự đoán kết quả của các quyết định kỹ thuật tồi của họ trên các công cụ mà họ sử dụng kém.
Làm gì trong trường hợp của bạn?
Kinh nghiệm của tôi là, khi ở Rome, hãy làm như người La Mã làm .
Đừng chống lại nó. Nếu những người trong công ty của bạn muốn dán nhãn procs cửa hàng là một thực hành xấu, hãy để họ. Tuy nhiên, hãy lưu ý rằng đây có thể là một lá cờ đỏ trong thực hành kỹ thuật của họ.
Ghi nhãn điển hình của những thứ như thông lệ xấu thường được thực hiện trong các tổ chức có hàng tấn lập trình viên bất tài. Bằng cách liệt kê một số thứ nhất định, tổ chức cố gắng hạn chế thiệt hại gây ra trong nội bộ bằng sự bất tài của chính họ. Tôi không shit bạn.
Tổng quát là mẹ của tất cả các vít lên. Nói rằng procs lưu trữ (hoặc bất kỳ loại công nghệ) là một thực tiễn xấu, đó là một khái quát. Khái quát là cop-outs cho người bất tài. Các kỹ sư không làm việc với sự khái quát trắng trợn. Họ phân tích trên cơ sở từng trường hợp cụ thể, phân tích đánh đổi và thực hiện các quyết định và giải pháp kỹ thuật theo các sự kiện có sẵn, trong bối cảnh họ phải giải quyết một vấn đề.
Các kỹ sư giỏi không gắn nhãn những thứ là thông lệ xấu theo những cách khái quát như vậy. Họ nhìn vào vấn đề, chọn công cụ phù hợp, đánh đổi. Nói cách khác, họ làm kỹ thuật.
Ý kiến của tôi về cách không sử dụng chúng
Đừng đặt logic phức tạp ngoài việc thu thập dữ liệu (và có lẽ một số biến đổi) trong chúng. Bạn có thể đặt một số logic tạo khối dữ liệu vào chúng hoặc tổng hợp kết quả của nhiều truy vấn với chúng. Nhưng đó là về nó. Bất cứ điều gì ngoài đó sẽ đủ điều kiện là logic kinh doanh sẽ nằm ở một nơi khác.
Đừng sử dụng chúng làm cơ chế bảo vệ chống lại việc tiêm SQL. Bạn để chúng ở đó trong trường hợp có điều gì đó không tốt với chúng , nhưng cần có một loạt logic phòng thủ trước mặt chúng - xác thực / chà sát phía máy khách, xác thực / chà sát phía máy chủ, có thể chuyển đổi thành các loại có ý nghĩa trong bạn mô hình miền và cuối cùng được chuyển đến các câu lệnh tham số hóa (có thể là các câu lệnh SQL được tham số hóa hoặc các procs được lưu trữ tham số.)
Đừng biến cơ sở dữ liệu thành nơi duy nhất chứa procs cửa hàng của bạn. Các procs cửa hàng của bạn nên được xử lý giống như bạn đối xử với mã nguồn C # hoặc Java của mình. Đó là, kiểm soát nguồn định nghĩa văn bản của procs cửa hàng của bạn. Mọi người cho rằng cửa hàng procs không thể được kiểm soát nguồn - bullcrap, họ chỉ không biết họ đang nói về cái quái gì.
Ý kiến của tôi về cách sử dụng chúng
Ứng dụng của bạn yêu cầu dữ liệu cần được chuyển đổi hoặc tổng hợp từ nhiều truy vấn hoặc chế độ xem. Bạn có thể giảm tải từ ứng dụng vào db. Ở đây bạn phải thực hiện phân tích hiệu suất vì a) các công cụ cơ sở dữ liệu hiệu quả hơn mà các máy chủ ứng dụng thực hiện những việc này, nhưng b) máy chủ ứng dụng (đôi khi) dễ dàng mở rộng theo chiều ngang.
Kiểm soát truy cập hạt mịn. Bạn không muốn một số kẻ ngốc chạy cartesian tham gia vào db của bạn, nhưng bạn không thể cấm mọi người thực thi các câu lệnh SQL tùy ý như thế. Một giải pháp điển hình là cho phép các câu lệnh SQL tùy ý trong các môi trường phát triển và UAT, trong khi cấm chúng trong các môi trường sản xuất và hệ thống. Bất kỳ tuyên bố nào phải đưa nó vào hệ thống hoặc sản xuất đều đi vào một quy trình lưu trữ, được xem xét mã bởi cả nhà phát triển và dbas.
Bất kỳ nhu cầu hợp lệ nào để chạy câu lệnh SQL không có trong kho lưu trữ đều phải thông qua một tên người dùng / tài khoản và nhóm kết nối khác nhau (với việc sử dụng được giám sát và khuyến khích cao.)
- Trong các hệ thống như Oracle, bạn có thể có quyền truy cập vào LDAP hoặc tạo liên kết tượng trưng cho cơ sở dữ liệu bên ngoài (giả sử gọi một cửa hàng Proc trên db của đối tác kinh doanh thông qua vpn.) Cách dễ dàng để làm mã spaghetti, nhưng đôi khi đúng với mọi mô hình lập trình bạn có các yêu cầu kinh doanh / môi trường cụ thể mà đây là giải pháp duy nhất. Cửa hàng procs giúp gói gọn sự khó chịu đó ở một nơi, gần với dữ liệu và không phải truy cập vào máy chủ ứng dụng.
Việc bạn chạy cái này trên db như là một cửa hàng Proc hay trên máy chủ ứng dụng của bạn tùy thuộc vào phân tích đánh đổi mà bạn, với tư cách là một kỹ sư, phải thực hiện. Cả hai tùy chọn phải được phân tích và chứng minh bằng một số loại phân tích. Đi bằng cách này hay cách khác bằng cách đơn giản cáo buộc phương án khác là "thực hành tồi", đó chỉ là một sự đồng ý kỹ thuật khập khiễng.
- Trong các trường hợp đơn giản là bạn không thể mở rộng quy mô máy chủ ứng dụng của mình (.ie. Không có ngân sách cho các trường hợp phần cứng hoặc đám mây mới) nhưng với nhiều khả năng trên back-end db (điều này điển hình hơn mà nhiều người quan tâm thừa nhận), nó trả tiền để di chuyển logic kinh doanh để lưu trữ procs. Không đẹp và có thể dẫn đến các mô hình miền thiếu máu ... nhưng sau đó một lần nữa ... phân tích đánh đổi, điều mà hầu hết các phần mềm hack đều hấp dẫn.
Cho dù điều đó có trở thành một giải pháp lâu dài hay không, điều đó cụ thể đối với các ràng buộc được quan sát tại thời điểm cụ thể đó.
Hy vọng nó giúp.