Làm sao để nhận Stored Procedure trong SQL Server
Em có viết 1 số Proc trong SQL có tham số để trả về 1 bảng danh sách.
Vậy làm thế nào để em có thể lấy được nó về ạ. Em chỉ thấy table khi connect đến Slq server thôi ạ.
Và nếu có thì điều này có bảo mật không ạ. File excel này còn được gửi đi cho những người khác nữa ạ.Create PROCEDURE sl_ListHocSinh @ma varchar(20) AS BEGIN select * from tbHocSinh where trangThai='X' AND matruong=@matruong ENDĐây là code em viết trên sql server
Em cảm ơn!
Lấy nó về là sao bạn? Bạn định làm gì.
Bạn dùng procedure là đúng rồi, đặc biệt nhiều khi nhiều người dùng.
Đây là code mình đang sử dụng cho file của mình, bạn có thể xử lý tiếp rs như câu truy vấn thông thường.
Command.ActiveConnection = cn Command.CommandTimeout = 60 Command.CommandType = adCmdText Command.CommandText = "sl_ListHocSinh '""& Biến tương ứng với Biến @ma trong SP &""'" Set rs = Command.ExecuteNếu bạn có quyền trong database thì có thể tạo một 1 user chỉ có quyền thực thi các câu lệnh SP thôi, sau đó bỏ user đó vào câu truy vấn kết nối đến database, đây là cách bảo mật dữ liệu hiện tại của mình, người dùng có thể biết code VBA, nhưng dữ liệu trên database thì sẽ không xem được hết.
Cảm ơn bạn nhé, để mình thử xem ạ.
Hiện tại server đó là mình quản lý bạn à. Vì ứng dụng viết trên Access dùng nội bộ và cả qua Internet, Vì mình cứ phải lấy dữ liệu qua access sau đó tải ra file excel sau đó thực hiện copy các data thô vào 1 file excel mà đã xây dựng sẵn để refrest là dữ liệu sẽ có như đã xây dựng,
nên mình muốn là khi nào mở file excel ra thì refresh tại excel luôn không bị mất nhiều thao tác
CommandType là adCmdStoredProc
CommandText là tên của SP (stored procedure)
Sau đó phải refresh Parameters, và set từng Parameter.
Đối với các kết nối vung văng (cho phép ADO kết nối như vậy có thể coi là vung văng, không đáng tin cậy), mục đích chính của SP là giới hạn quyền truy cập và chống SQL Injection.
SQL Injection là một kỹ thuật dùng tham số sửa đổi câu lệnh CommandText để phá hoại CSDL. SP chỉ nhận tham số qua parameters cho nên người phá hoại không thể sửa đổi câu lệnh SQL bên trong SP.
Cái SQL Injection em có tìm hiểu qua và em xử lý nó 1 cách đơn giản là loại bỏ hết những ký tự đặc biệt khi người dùng nhập vào như vậy có ổn không ạ?
1587522610Em lấy ra để làm báo cáo 1 à.
Nếu tôi trả lời thẳng câu này là tôi nói dóc.
Muốn biết "ổn" (an ninh) hay không thì phải biết thiết kế của Server. Chỉ có người Admin của Server mới trả lời được.
Nếu CSDL chứa trong file Excel là căn hộ nhỏ thì SQL Server Database là một cơ quan làm việc.
Cho phép một user kết nối là bạn đã giao một chùm chìa khoá cơ quan. Số chìa khoá tuỳ theo số quyền của user, nhưng chùm nào cũng phải có cái chìa mở cổng chính.
Vì vậy cơ quan luon phải cảnh giác 2 điều sau:
1. user lạm dụng quyền
2. kẻ xấu ăn cắp chùm chìa khoá từ user (hoặc là bạn bè, bám theo) để vào cơ quan. Điểm này quan trọng hơn điểm trên, vì kẻ xấu này rất nhiều khả năng là giỏi hơn bạn.
Những nơi tôi làm việc, SQL Server được bảo vệ như thành trì. Một user phải có văn bản trưởng phòng yêu cầu Admin cho phép kết nối và văn bản nêu rõ phạm vi truy cập. Nếu user không phải là developer thì Adimm buộc phải qua một buổi huấn luyện về sử dụng. Admin thường xuyên phân tích cái log để kiểm soát những hoạt động của users.
Vâng. Em cảm ơn anh.
Hiện tại SQL SV em đang dùng là em cài đặt luôn trên 1 PC mà em làm việc. Về vấn đề bảo mật thì đúng là em không hiểu gì nhiều và thực chất cũng không có nhiều kiến thức để tìm hiểu và làm cho nó an toàn. Ban đầu chỉ là xây dựng 1 ứng dụng nhỏ tiện mình quản lý, càng sau càng nâng cấp để người khác dùng được và dùng qua được cả internet, để đến được từ bước xấy dựng code và cách kết nối đến SQL SV cũng là 1 trạng đường dài để tìm hiểu. Về vấn đề an toàn thì e chỉ có thể backup data hàng ngày để đề phòng vì e nghĩ dữ liệu này chỉ quan trọng với e và 1 số đồng nghiệp vì nếu mất thì không có gì để sử dụng tiếp theo. Còn với người khác thì chắc không có ý nghĩa
Các Form nhập liệu đầu vào em cũng sử dụng parameter và xử lý các ký tự đặc biết để tránh người dùng vô tình hoặc gì thôi ạ.
Vậy anh có thể cho em hỏi. Nếu khi sử dụng qua internet và các file excel hoặc front end được kết nối đến server mà chỉ toàn người trong cty sử dụng (đa phần k biết gì về data) thì những người mà k có ứng dụng e xây dựng kết nối đến SQL server thì có thể phá hoại được CSDL của em không ạ?
Nếu nó chỉ trên một PC thì vấn đề bảo mật và an toàn không quan trọng.
Chỉ quan trọng ở chỗ cần backup thường xuyên. Nếu backup qua mạng được thì càng tốt.
Nếu bị attacked thì bạn có thể recover và reconfigure dễ dàng.
File font end là Excel hay Access điều phải có cái hàm để kết nối tới SQL Server mà hàm này tất nhiên phải chứa thông tin username và pass đăng nhập SQL Server. Khi có 2 thông tin này thì người ta có thể dùng lệnh "Select.." để liệt kê các Table có trong SSV và lấy dữ liệu về xem.
Để khoá không cho xem code thì Access chỉ cần chuyển sang .accde là không xem được, còn Excel thì bạn phải phải kiếm tool, hàm để khoá xem VBA code, mã hoá phần thông tin đăng nhập này,
www.giaiphapexcel.com/diendan/threads/l%C3%A0m-sao-%C4%91%E1%BB%83-nh%E1%BA%ADn-stored-procedure-trong-sql-server.149192/
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học
"lâu" đối với tôi không phải là một yếu tố. "lâu" ở một hệ thống này vẫn có thể "nhanh" ở hệ thống khác.
Sử dụng adCmdStoredProc là cách chính thống để gọi SP
Dùng text là cách đi vòng. Vì nó là full text cho nên không đủ an toàn.
Tuy nhiên, như toi đã nói ở bài #10, nếu nó chỉ là hệ thống cá nhân thì chả cần an toàn. Và trừ phi cái SP rất lớn, xài dynamic SQL luôn cho khoẻ.
SP chỉ dùng cho các truy vấn đã được thành hình. Một khi đã được dùng vào code rồi thì rất ít khi người ta chỉnh sửa nó. Các hệ thống lớn đều có cache lệnh sử lý của SP.
Tuy theo lý thuyết, chỉnh SP là tất cả mọi code gọi nó đều xài được nhưng trên thực tế, bạn chỉ chỉnh sửa được cách làm việc bên trong thôi, cái giao diện (interface: tức là parameters và result set) thì bạn phải giữ. Nếu nó thay đổi tínhn chất hoặc cấu trúc kết quả hoặc giao diện thì mọi code gọi nó cũng phải chỉnh sửa như thường (thêm bớt parameters, thêm bớt số cột trả về…)
Trên thực tế, khi chỉnh sửa một SP, người ta đặt luôn một cái tên mới và hẹn ngày decommission cái cũ.
Ví dụ: Bạn có một cái SP nhiều người dùng. Mỗi lần bạn sửa nó bạn phải báo cho tất cả những người dùng nó. Code của tôi gọi SP của bạn. Bạn sửa SP, quên báo cho tôi biết thì sao? Code tôi có khả năng lấy kết quả sai (đúng với bạn, nhưng sai với tôi) mà tôi không hề hay.
Sao bạn không tạo kiểu này cho gọn:
Sau này muốn thêm điều kiện cũng thêm 1 dòng đơn giản hơn.
Còn về viêc dùng CommandType là adCmdStoreProc hay adCmdText nhanh chậm cũng là do cách thiết kế Store proc. Nếu Stored proc dùng SQl động sẽ nhanh hơn dùng SQL tĩnh.
Cái ví dụ trên là tôi dùng SQL tĩnh nên có thể khi chạy lần đầu sẽ nhanh, mấy lần sau sẽ châm, qua máy khác cũng vậy. Đó là do kiểu Stored Proc này tạo một cái Execution plan khi lần đầu chạy và lưu vào sp cache, những lần chạy sau nó lấy cái execution plan này ra chạy nhưng có thể không phù hợp với file dữ liệu lần sau nên tốc độ sẽ chậm. Để khắc phục tôi thêm "WITH RECOMPILE" để mỗi lần chạy là mỗi lần tạo Execution plan mới, tốc độ chăc chắn nhanh hơn nhưng hệ thống lại mất thêm thời gian tạo execution plan.
Ở bài #13, ngừoi ta không nói rõ cái tốc độ là tốc độ tính toán hay tốc độ trả về kết quả cho nên tôi khong muốn nói thêm.
Tôi chỉ nhấn mạnh ở đây là dùng lệnh gọi SP tức là xử lý thẳng câu lệnh EXEC, tức là tự bỏ qua tính chất an toàn và độc lập của SP.
Cách gọi chính thống xác định rõ ràng đây là mọt procedure call, không phải là xử lý một lệnh. Và giữ nguyên tính chất an toàn của SP.
Nếu tôi viết SP thì tôi chỉ cho user quyền gọi SP. Tôi không cấp quyền chạy lệnh SQL.
Và ở bài #10 tôi có nói rằng nếu chỉ một máy nhỏ quèn thì chẳng cần phải biết chính quy hay đường vòng gì cả.
Càng linh động thì càng phải giải thích cho người dùng nhiều.
Thói quen của nhiều người trên diễn đàn này là làm một cái module đủ thứ công việc, rồi dùng parameters để lái nó vào chỗ code cần thiết.
Cái đó không hoàn toàn sai, nhưng họ sai ở chỗ là một cái hàm hầm bà lằng như vây thì phải chú thích cách sử dụng parameters. Ở diễn đàn này, thói quen chú thích code hầu như không có.
Mặt khác, ngày xưa, máy tính yếu nên người ta dồn nhiều công việc vào một chỗ. Bây giờ là thời buổi lập trình hướng đói tượng. Người ta bó gọn công việc của procedure, hàm nào làm đúng công việc của nó. Nếu cần một cái "làm mọi thứ" thì viết hêm một cái "hầm bà lằng" tuỳ theo tình huống mà nó gọi những cái bó gọn kia. Đương nhiên nhiên gọi hàm là overhead, nhưng tôi sẵn sàng hy sinh tốc độ để bảo đảm việc quản lý code.
Không thể khẳng định sql động sẽ nhanh hơn dùng sql tĩnh bạn.
Không phải lúc nào procedure cũng tạo plan tốt và lưu vao cache nó phụ thuộc vào parameter sniffing nên bạn nói nó chậm hơn là do plan chưa tốt thôi, procedure dùng sql tĩnh sẽ nhanh hơn động nếu có plan tốt vì nó không phải mất công tạo plan nũa mà sử dụng lại. Đương nhiên là execution plan sẽ thay đổi chứ nó không cố định nên chúng ta vẫn phải theo dõi thường xuyên nếu proc đó quan trọng.
Execution plan se thay đổi khi có sự thay đổi về cấu trúc bảng, db, và statitics của các bảng..
Trên ngữ cảnh của một procediure, khi tôi nói users tức tôi nói "users of the procedure", tức là người viết code, hoặc cái đối tượng gọi procedure.
Cứ theo dõi code VBA trên diễn đàn này sẽ thấy.
Có một vài hàm được viết ra với cả đống options. Nhìn vào rừng bỏ bố. Sỡ dĩ một số thành viên khác vẫn dùng và khuyến khích (recommend) dùng là vì họ quen với lối code này, và đã quen thuộc với hàm này.
Nếu bạn để ý sẽ thấy các thành viên được khuyến khích sẽ chẳng hiểu gì cả, cứ nhắm mắt mà theo thôi.
Mạt khác, có những hàm viết rất hoành tráng đầy đủ tùm lum, nhưng đưa đến ngừoi dùng thì họ tá hoả tam tinh. Chính thực là do ngừoi viết chỉ cốt hoành tráng mà không giải thích cách sử dụng.
Trên quan điểm của một project manager, câu bôi đỏ trên sẽ được khuyên đỏ.
Tổ chức quản lý code thuộc về project chứ không phải cá nhân. Bởi vì bạn quen dựng project cá nhân cho nên có thể tự mình quản lý.
Trên thực tế, chỉ những developers kỳ cựu mới được leader cho quyền tự phân lấy interfaces của module mình viết ra. Các developers non thì chính thức chỉ là người dịch thuật toán thành code.
Những project lớn, code có peer review. Viết mà không đủ chú thích cho dễ hiểu tụi nó khuyên đỏ tan nát hết.
"Tái sử dụng" là một trong những tínhn chất của LTHĐT. Chính vì cái này mà tôi mới nói chuyện rằng việc nào procedure nấy, nhiều việc thì viết thêm một cái procedure gọi mấy cái kia. Căn là tránh một cái ôm đồm một đống công việc. Và viết một cái hàm "uyển chuyển" với nhiều options là đường lối xưa (xem định nghĩa overhead bên dưới). Lý do:
– theo quan niệm ai là việc nấy của LTHĐT thì nếu công việc A và B không chia sẻ nhau đa số code thì A nên độc lập với B. Nếu số code chia sẻ xứng đáng gọi là một công việc thì thêm phần tử C để cho A và B cùng gọi C. Code như vậy mới dễ "tái sử dụng". Vì chúng rõ rệt và riêng biệt. Lúc debug có thể bubble từ dưới lên trên. Lúc cần thay đổi thì chỉ cần nhắm đúng cái procedure chứa phần cần thay đổi.
Phần tô tím ở trên cũng sẽ được khuyên đỏ.
Trên nguyên tắc lập trình, những cái thay đổi dữ liệu, nếu có thể được thì nên được đặt riêng với những cái chỉ truy xuất dữ liệu.
Đối với SQL Server procedure, điều này khá quan trọng vì tôi có thể cho users class A quyền Insert nhưng không Update, user class B chỉ truy vấn. Chia ra nhiều procedures giúp tôi kiểm soát điều này dễ dàng. (có nhiều cách đi vonngf để không chia cũng được, nhưng cách kiểm soát rắc rối hơn)
Đối với lập trình thì đó là nhiệm vụ của ByVal và ByRef.
Microsoft có nói rõ là ByVal sẽ tạo overhead, bởi vì chương trình phải copy một phiên bản local của tham, nhét tham vào stack và khi thoát thì lấy trở ra. Vậy thì ByVal được cái lợi gì? Cái lợi rõ rệt nhất của nó là người sử dụng hàm chỉ cần nhìn vào câu khai báo là có thể an tâm rằng biến nạp vào tham này sẽ không bị thay đổi. Nói cách khác, hàm khai báo ByVal HỨA rằng nó sẽ không thay đổi giá trị của biến nạpn vào tham.
Nếu bạn có dùng C++ thì cũng biết C++ đã khổ tâm với Const biết bao nhiêu để bảo vệ cái tính chất "tôi hứa rằng tôi sẽ không biến đổi trị của biến này"
Overhead của hướng dối tượng là kết nối trễ, là bảng ảo (virtual table).
Overhead của hàm là gọi hàm thì phải lập stack, và kết nối.
Overhead của các tham ByVal là phải copy lại thành một biến mới. Nếu biến là một object thì có thể liên hệ nhiều điều khác.
… các overhead khác…
Khi tôi nói overhead của kỹ thuật chia ra nhiều hàm nhỏ là tôi muốn nói cái điểm thứ hai ở trên.
Trước khi bạn kia xác định là tốc độ đo bên SQL Server hay bên ADODB thì khó có thể đoán được gì cả.
Khi ADODB và Server 'handshake' qua cái connection thì ta chỉ mới tạo đường dẫn thôi.
Khi Command Execute thì ADO mới qua cái connection ấy, thảy một đống điều kiện cho SS và chúng cũng sẽ đồng ý với nhau về protocols (nghi thức trao đổi). Kế đó SS mới làm việc.
Protocol cho adCmdStoredProc khác với protocol adCmdText.
Vì vậy có cả đống lý do để tốc độ khác nhau. Ví dụ (chỉ ví dụ) bên procedure cache kết quả cho đủ rồi mới bắt đầu truyền trong khi bên text thì lấy đuọc package nào truyền pachage nấy thì rất có thể tốc độ khác nhau tuỳ theo độ rộng và độ ưu tiên của đường truyền.
Nếu bắt buộc phải đoán mò thì tôi đoán tốc độ chạy SP như nhau. Phần khác nhau nằm ở cái protocol mà ADO thoả thuận với SS. Hoặc ở chỗ máy bạn ấy nó trả về kết quả một loạt nếu gọi thẳng SP và trả về từng đợt nếu gọi qua lệnh Exec. Nếu đúng cái này thì admin phải tune nó.
Quan niệm về "tái sử dụng" của bạn khác với tôi.
Từ lúc sử dụng HĐT đến giờ. Tái sử dụng đố với tôi là một function hoặc class đã dùng được tốt rồi thì để yên đó mà dùng. Muốn thêm thắt gì thì viết thêm cái wrapper (nếu function thì viết thêm function khác gọi nó, nếu class thì inherit nó ra class rộng hơn). Cái functioon/class cũ luôn luôn để yên đó.
Tôi đã nói rồi. Gọi SP bằng command là tiêu chuẩn. Gọi bằng text là cách đi vòng. Vấn đề bottleneck/chạy chậm (nếu có) ở ưu tiên xử lý của SS hoặc cách truyèn kết quả là do tính chất kết nói giữa ADO và SS. Thường thì cái bottleneck này có thể được giải quyết bởi một admin giỏi. (tôi chỉ biết đến vậy thôi, admin của Server là ngành ngoài kiến thức của tôi)
Nếu đi vòng mà hiệu quả hơn thì chỉ cần cân nhắc giữa cái lợi hiệu quả và an toàn. Cái nào hơn thì dùng. Chấm hết.
Bạn quen dùng text thì thấy câu lệnh text dễ dùng. Tôi quen nạp params tuần tự thì thấy nạp từng params nó rõ hơn.
Về việc quản lý số hàm thì cũng như người trại chủ đặt một khu trại chung và phân chuồng bên trong thì thấy dễ quản lý. Nhưng trại chủ khác lại thích chia trại mình ra từng khu riêng quản lý dễ hơn. Cái hại là tốn nhiều chỗ, và đi lại nhiều hơn. Cái lợi là nếu có bệnh thì không đến nổi chết cả đàn.
Chú: theo như lời bạn nói thì tôi đoán có bạn cũng dùng C#. Winform, Webform, hay MVC không thành vấn đề; code C# là chỉ viết mấy cái method cho class framework có sẵn hoặc class mới.
C# là loại ngôn ngữ "strong type". Tính chất "strong type" này giúp nó sử dụng hàm chồng (function overloading) dễ dàng.
Theo lý thuyết, loại ngôn ngữ có hàm chồng như C++, Java, C#… trình dịch không dịch thẳng tên hàm ra địa chỉ mà dùng một kỹ thuật name mangling để dịch cái prototype (thực ra là signature) của hàm. Prototype của hàm gồm tên hàm, kiểu trả về, và parameters list. Signature chỉ gồm tên hàm và params list. Name mangling không lý đến kiểu trả về, lý do hiển nhiên.
Trái lại, JavaScript là ngôn ngữ "super type". Vì tính chất này cho nên nó khó viết hàm chồng. Để viết hàm chồng, ngừoi ta dùng một hàm lớn và gọi các hàm con (tìm hiểu về kỹ thuật dùng closure để viết hàm chồng, jQuerry cũng có cách viết hàm chồng của nó). Đó là kỹ thuật tôi đề nghị với bạn ở các bài trước. Tuy nhiên, bạn có vẻ thích viết kiểu một hàm làm đủ thứ.
Kết luận: VBA không phải là ngôn ngữ HĐT. Ép nó theo kiểu hàm chồng là gượng ép nặng tay. Viết một hàm làm đủ thứ không phải là chính sách của tái sử dụng (reusable code). Nguyên tắc chung của tái sử dụng là hàm chỉ làm một công việc, n công việc thì n hàm, và một hàm đã tốt rồi thì để yên nó.
Tôi không nói nhiều về SP của SS vì Microsoft bỏ rất nhiều đầu tư vào SS để cạnh tranh với Oracle. Cho nên nó cũng có tính chất như Excel. Tức là performance của nó không dựa trên lô gic mà dựa trên nhu cầu thị trường.
Tôi không biết bạn thiết kế Sub như thế nào chứ như cái hàm dưới đây của tôi là chạy chung cho bất kỳ Stored proc. nào và đưa tham số vô cũng đơn giản. (Thực ra đây là cái hàm trong Class, chuyển qua standard module cũng tương tự)
2631
– Hàm ExecuteSPWithADOCommand(): tôi dùng hàm này chạy chung cho 7 cái stored proc liệt kê trong Listbox trên.
– Gọi hàm khi thực thi: 7 cái stored proc riêng biêt.
khác nhau chứ bạn thao tác SQL mà không xác định Type sao làm
nghiên cứu đi, lý thuyết mình yếu lắm.
Bạn nhiệm ra rồi thì truyền tham số rất đơn giản
Cách của mình làm giống với cách của Ông Ba bị đó, chỉ khác chút xíu, với lại câu từ mình dở lắm không biết giải thích, mình chỉ hiểu và làm thôi
Tôi nghĩ bạn đọc code sai ở đoạn này rồi hoặc do tôi chưa hiểu cách dùng từ của bạn.
– Cái hàm getType() là tôi tạo tham số (parameter) để đưa vào tập hợp các tham số (Parameters). Có thể tôi đặt tên chưa sát tính năng của nó, nó không có kiểm duyệt biến gì cả. Vì tôi đã biết các tham số thiết kế trong SP là kiểu gì rồi nên tôi khai báo tường mình luôn các tham số này (size, type, value) và Append vào Parameter Collection. Sau đó chỉ viêc thi hành (Execute).
– Tôi dùng objCmd.Parameters.Append getType(value) nó khác so với Cmd.Parameters.Item("@option").Value. Tôi tạo tập hợp tham số (Parameter collection) và tạo tham số và nạp giá trị của nó vô luôn. Còn câu lệnh của bạn là đã có tập hợp tham số rồi, giờ dùng phương thức .Item("tên tham số") để gán giá trị cho nó. Tôi nghĩ có thể đâu đây là nguyên nhân khiến bạn cảm thấy chậm khi bạn nói khai báo các parameter.
Đối tượng Command của ADO có một phương thức là "Refresh". Khi bạn tương tác với Stored Proc, nếu bạn không chủ động tạo parameter collection như cách tôi đang làm (createParameter, append) thì dùng Command.Refresh. Khi "Refresh" ADO sẽ tự động liên lạc provider SQL SV lấy thông tin tất cả các tham số của Stored Proc mà bạn đang gọi tự tạo collection cho bạn, khi đó bjan chỉ cần dùng câu lệnh của bạn để gán trị cho tham số. Chính cái việc "Refresh" này làm chậm tiến trình xử lý Stored proc đáng kể.
Nói về cái SP của bạn, bạn nghĩ SP nôm na như một cuốn sách và các câu lệnh "Select" trong nó là 1 trang của cuốn sách. Vậy khi bạn gọi SP giống như mở cuốn sách, số trang ít thì cuốn sách nó nhẹ và tìm trang theo mục lục cũng nhanh hơn một cuốn Bách khoa toàn thư. Bạn cũng biết là khi load stored proc thì SQL SV cũng phải cấp phát bộ nhớ cho nó mà, nó nặng nề thì chiếm nhiều bộ nhớ cache thôi.