[Vba] Kiểm tra user đã đăng xuất chưa

Liên hệ QC

An.BA

Thành viên thường trực
Tham gia
15/9/18
Bài viết
223
Được thích
170
Giới tính
Nam
Em có viết 1 ứng dụng trên ms Access Form kết nối đến sql server trọng mạng nội bộ. Hiện tại em muốn thêm 1 chức năng kiểm tra user đã đăng xuất chưa ạ. Em chỉ làm được sự kiện đóng form thì sẽ update lại trạng thái user đó nhưng nếu họ ngắt kết nối rồi đóng form thì làm sao server của em cập nhật được ạ.
Em cảm ơn mọi người.
 
Có 2 cách:
1. Thêm hàm cập nhật hiện trạng kết nối vào cái thủ tục "mở/đóng kết nối".
2. Khai thác các thủ tục hệ thống có sẳn của SQL Server như:
- Chạy stored proc. "sp_Who2".
- Lấy thông tin kết nối từ các table hệ thống: sys.dm_exec_connections; sys.dm_exec_sessions;

221289
 
Trong cơ quan bạn, bên nào quyền hạn cao hơn? bên sử dụng Access hay bên quản lý SQL Server?

Trên nguyên tắc, SQL Server là CSDL chủ, nó cho phép người ta kết nối vào và tự kiểm soát các kết nối ấy. Bên xin phép kết nối chỉ việc nhập vào và rút lui khi hết việc thôi.

Túm lại, quản lý SQL Server có những công cụ để kiểm soát những cái này. Nếu tôi là admin của máy chủ, tôi buộc tất cả những code VBA (*) kết nối với máy tôi phải đăng ký (**).

(*) Thực ra code nào cũng phải đăng ký. Nhưng VBA là quan trọng nhất vì nó lỏng lẻo nhất.
(**) Ở trên tôi có hỏi ai quyền hạn cao hơn. Đương nhiên nếu cơ quan đặt quyền hạn của admin SQL server quá thấp thì là chuyện của cơ quan, bị attack ráng chịu.
 
Trong cơ quan bạn, bên nào quyền hạn cao hơn? bên sử dụng Access hay bên quản lý SQL Server?

Trên nguyên tắc, SQL Server là CSDL chủ, nó cho phép người ta kết nối vào và tự kiểm soát các kết nối ấy. Bên xin phép kết nối chỉ việc nhập vào và rút lui khi hết việc thôi.

Túm lại, quản lý SQL Server có những công cụ để kiểm soát những cái này. Nếu tôi là admin của máy chủ, tôi buộc tất cả những code VBA (*) kết nối với máy tôi phải đăng ký (**).

(*) Thực ra code nào cũng phải đăng ký. Nhưng VBA là quan trọng nhất vì nó lỏng lẻo nhất.
(**) Ở trên tôi có hỏi ai quyền hạn cao hơn. Đương nhiên nếu cơ quan đặt quyền hạn của admin SQL server quá thấp thì là chuyện của cơ quan, bị attack ráng chịu.
Em là người quản lý 2 cái đó ạ.
Và em cũng chưa hiểu cách của 2 bác nói lắm. Mong 2 bác chỉ cho em kỹ hơn nữa ạ.
Vì nói về vấn đề kiểm soát thì em chỉ có thể làm được sự kiện đóng form sẽ "update set trangthai=false from tbUsers where MaNhanVien='SG0009'"
Nhưng như em nói, khi bị mất kết nối hay gì đó thì câu lệnh đó không thể update tới sql Server được ạ.
Vì em mới nên chưa rõ lắm về các cách 2 bác là nói và vẫn mơ hồ ạ. Mong 2 bác chỉ rõ hơn cho em nữa được không ạ.
Em cảm ơn nhiều ạ.
 
Theo như những bài hỏi của bạn mấy bữa nay thì cơ quan bạn rõ ràng không có một quy trình xác định trách nhiệm từng bộ phận.

Thằng xin kết nối, tức là thằng Access Form, cũng giống như thằng lái xe tải vào kho hàng bạn để lấy hàng.
Bạn không thể dựa vào nó để: "mỗi lần vào lấy hàng thì ghi sổ mở kho, và lấy xong, đóng kho lại cũng ghi sổ đóng kho."
Việc mở đóng kho là nhiệm vụ bên quản kho. Tất cả sự kiện xảy ra ở cửa kho và trong kho đều phải qua thủ kho.
 
Theo như những bài hỏi của bạn mấy bữa nay thì cơ quan bạn rõ ràng không có một quy trình xác định trách nhiệm từng bộ phận.

Thằng xin kết nối, tức là thằng Access Form, cũng giống như thằng lái xe tải vào kho hàng bạn để lấy hàng.
Bạn không thể dựa vào nó để: "mỗi lần vào lấy hàng thì ghi sổ mở kho, và lấy xong, đóng kho lại cũng ghi sổ đóng kho."
Việc mở đóng kho là nhiệm vụ bên quản kho. Tất cả sự kiện xảy ra ở cửa kho và trong kho đều phải qua thủ kho.
Vâng em hiểu ý bác, nhưng để làm được thì em không biết ạ. vì em chỉ biết chút ít kiến thức vba để viết ra công cụ dễ quản lý và mới học được cách kết nối dữ liệu vào sql server để lưu trữ ạ (kết nối nội bộ) nên em phải đi hỏi từng phần nào mà em chưa tìm được ra cách và chưa làm được ạ.
 
Tôi cố sức tránh dẫn diễn đàn này qua diễn đàn khác.
Nhưng có lẽ trường hợp của bạn cần phải ngoại lệ.

Một khi đã xác định vấn đề của bạn nằm bên SQL Server chứ không phải Access thì bạn cần vào các diễn đàn về SQL Server mà tư vấn.
Thử vào SQLViet hỏi xem. Nhớ mang máng chủ diễn đàn này là Vũ Huy Tâm. Tay này đã từng tổ chức hội thảo về SQL Server, tay nghề có lẽ không kém.

Xin xác định lại là tôi không có ý quảng cáo cho ai hết. Và tôi không hề là thành viên SQLViet.
 
Vâng em hiểu ý bác, nhưng để làm được thì em không biết ạ. vì em chỉ biết chút ít kiến thức vba để viết ra công cụ dễ quản lý và mới học được cách kết nối dữ liệu vào sql server để lưu trữ ạ (kết nối nội bộ) nên em phải đi hỏi từng phần nào mà em chưa tìm được ra cách và chưa làm được ạ.

Bạn đưa cái form Access kết nối, nội dung table lưu thông tin đăng nhập như thế nào... mà bạn đã làm lên đây thì mọi người mới hỗ trợ nhanh được.
Phải xem bạn tổ chức có hợp lý chưa, dễ xử lý code không, các hàm, thủ tục kết nối bạn viết như thế nào rồi mới sửa.
Mấy tham số kết nối như: IP, user/ pass ...liên quan đến SQL server của bạn thì cứ đưa data dỏm được rồi.
 
Lần chỉnh sửa cuối:
Tôi cố sức tránh dẫn diễn đàn này qua diễn đàn khác.
Nhưng có lẽ trường hợp của bạn cần phải ngoại lệ.

Một khi đã xác định vấn đề của bạn nằm bên SQL Server chứ không phải Access thì bạn cần vào các diễn đàn về SQL Server mà tư vấn.
Thử vào SQLViet hỏi xem. Nhớ mang máng chủ diễn đàn này là Vũ Huy Tâm. Tay này đã từng tổ chức hội thảo về SQL Server, tay nghề có lẽ không kém.

Xin xác định lại là tôi không có ý quảng cáo cho ai hết. Và tôi không hề là thành viên SQLViet.
Vâng, Em cảm ơn thông tin của bác, nó có thêm cổng thông tin cho em tham khảo thì sao gọi là quảng cáo được ạ :)
Bài đã được tự động gộp:

Bạn đưa cái form Access kết nối, nội dung table lưu thông tin đăng nhập như thế nào... mà bạn đã làm lên đây thì mọi người mới hỗ trợ nhanh được.
Phải xem bạn tổ chức có hợp lý chưa, dễ xử lý code không, các hàm, thủ tục kết nối bạn viết như thế nào rồi mới sửa.
Mấy tham số kết nối như: IP, user/ pass ...liên quan đến SQL server của bạn thì cứ đưa data dỏm được rồi.
Vâng bác đợi e thiết kế lại cho dễ nhìn xong e đưa lên ạ.
 
Theo những gì bạn nói thì trách nhiệm và quyền hạn của bạn trong cơ quan tương đối nhiều.
Lời thật mất lòng, cái thời mà tôi còn làm việc với SQL Server thì trách nhiệm và quyền hạn của tôi chỉ bằng nửa bạn, nhưng kiến thức bắt buộc đã phải gấp đôi bạn.
Tôi tin là cơ quan của bạn hà tiện quá. Với nhân viên ở nhiệm vụ này, bạn phải qua khoá huấn luyện VÀ thường xuyên dự các hội thảo về phát triển và an ninh CSDL. Chỉ có ở những họi thảo này bạn mới có dịp giao lưu với trao đổi những kinh nghiệm cập thời. An ninh dữ liệu (data security) là trò chơi cút bắt. Bọn phá hoại chúng tiến triển rất nhanh. Bên bảo vệ bắt buộc không được dừng chân.

Rất tiếc là tôi không còn làm việc mạng nhiều nữa cho nên kiến thức không cập nhật, không thể giúp cho bạn nhiều hơn.
 
tôi thấy lạ là user họ dùng pm thì sao họ can thiệp đến server của bạn để tự ý ngắt kết nối. Việc xét kết nối hay không thì pm của bạn kiểm soát chứ.
 
Theo những gì bạn nói thì trách nhiệm và quyền hạn của bạn trong cơ quan tương đối nhiều.
Lời thật mất lòng, cái thời mà tôi còn làm việc với SQL Server thì trách nhiệm và quyền hạn của tôi chỉ bằng nửa bạn, nhưng kiến thức bắt buộc đã phải gấp đôi bạn.
Tôi tin là cơ quan của bạn hà tiện quá. Với nhân viên ở nhiệm vụ này, bạn phải qua khoá huấn luyện VÀ thường xuyên dự các hội thảo về phát triển và an ninh CSDL. Chỉ có ở những họi thảo này bạn mới có dịp giao lưu với trao đổi những kinh nghiệm cập thời. An ninh dữ liệu (data security) là trò chơi cút bắt. Bọn phá hoại chúng tiến triển rất nhanh. Bên bảo vệ bắt buộc không được dừng chân.

Rất tiếc là tôi không còn làm việc mạng nhiều nữa cho nên kiến thức không cập nhật, không thể giúp cho bạn nhiều hơn.
Thì công ty em muốn em làm cũng dùng nội bộ thôi ạ, em cũng chỉ làm để nó hoạt động ổn còn tất nhiên độ rủi do và các thứ khác e cũng bảo là em không phải dân chuyên nghiệp rồi ạ. và thay vào đó là bảo em backup dữ liệu hàng ngày bác ạ :D
Dù sao em cũng cảm ơn bác nhiều về những thông tin bổ ích ạ
Bài đã được tự động gộp:

tôi thấy lạ là user họ dùng pm thì sao họ can thiệp đến server của bạn để tự ý ngắt kết nối. Việc xét kết nối hay không thì pm của bạn kiểm soát chứ.
ý của em là khi họ thoát ra e muốn biết được họ đã logout đó ạ. thì phải làm thế nào ý ạ.
Bài đã được tự động gộp:

Bạn đưa cái form Access kết nối, nội dung table lưu thông tin đăng nhập như thế nào... mà bạn đã làm lên đây thì mọi người mới hỗ trợ nhanh được.
Phải xem bạn tổ chức có hợp lý chưa, dễ xử lý code không, các hàm, thủ tục kết nối bạn viết như thế nào rồi mới sửa.
Mấy tham số kết nối như: IP, user/ pass ...liên quan đến SQL server của bạn thì cứ đưa data dỏm được rồi.
Em không được phép upload file Access bác ạ.
 
Thì công ty em muốn em làm cũng dùng nội bộ thôi ạ, em cũng chỉ làm để nó hoạt động ổn còn tất nhiên độ rủi do và các thứ khác e cũng bảo là em không phải dân chuyên nghiệp rồi ạ. và thay vào đó là bảo em backup dữ liệu hàng ngày bác ạ :D
Dù sao em cũng cảm ơn bác nhiều về những thông tin bổ ích ạ
Bài đã được tự động gộp:


ý của em là khi họ thoát ra e muốn biết được họ đã logout đó ạ. thì phải làm thế nào ý ạ.
Bài đã được tự động gộp:


Em không được phép upload file Access bác ạ.
oh hay nhỉ, người dùng logout lúc nào mà bạn cũng không biết? Bạn tạo cái đăng nhập rồi mà không tạo cái logout? Tất cả do phần mềm chứ như mình nói thì user chẳng biết gì hay không có quyền hạn để vào thẳng CSDL của bạn để ngắt kết nối đâu.
 
Em không được phép upload file Access bác ạ.

oh hay nhỉ, người dùng logout lúc nào mà bạn cũng không biết? Bạn tạo cái đăng nhập rồi mà không tạo cái logout? Tất cả do phần mềm chứ như mình nói thì user chẳng biết gì hay không có quyền hạn để vào thẳng CSDL của bạn để ngắt kết nối đâu.

Đó cũng là lý do tôi muốn bạn gửi file lên để xem bạn tổ chức xử lý như thế nào đó. Mọi thứ như bạn quanluu1989 đã nói là xử lý ở hậu trường, còn người dùng thì không cần phải biết.
Sau này có thể không phải chỉ việc quản lý user login, logout mà còn có log file lưu theo dõi việc sửa/ xoá nội dung gì, ở table nào v.v..Bạn phải tổ chức CSDL, qui trình thao tác, xử lý trên form, code như thế nào để có thể lưu lại các thông tin trên.
 
oh hay nhỉ, người dùng logout lúc nào mà bạn cũng không biết? Bạn tạo cái đăng nhập rồi mà không tạo cái logout? Tất cả do phần mềm chứ như mình nói thì user chẳng biết gì hay không có quyền hạn để vào thẳng CSDL của bạn để ngắt kết nối đâu.
Cái login là họ phải kết nối tới sql server thì mới login được, còn logout là khi họ mất kết nối với sql server sau đó họ thoát ứng dụng đi trong thời điểm mất kết nối đó thì làm sao mà em biết được ạ. vì khi không có kết nối thì em không thể update câu lệnh vào sql server được. Hay là em chưa hiểu được cách của bác nhỉ? bác có thể nói rõ cho em được không ạ.
Bài đã được tự động gộp:

Đó cũng là lý do tôi muốn bạn gửi file lên để xem bạn tổ chức xử lý như thế nào đó. Mọi thứ như bạn quanluu1989 đã nói là xử lý ở hậu trường, còn người dùng thì không cần phải biết.
Sau này có thể không phải chỉ việc quản lý user login, logout mà còn có log file lưu theo dõi việc sửa/ xoá nội dung gì, ở table nào v.v..Bạn phải tổ chức CSDL, qui trình thao tác, xử lý trên form, code như thế nào để có thể lưu lại các thông tin trên.
Diễn đàn không cho phép em upload file lên ý ạ. Còn về việc theo dõi thêm/sửa/xóa trên các bảng thì em có để mấy cột để theo dõi: "stt_delete" là để xem trạng thái xóa hay k, và 1 số cột "nguoi_tao","ngay_tao","nguoi_sua","ngay_sua". Vì kiến thức không có nhiều nên em chỉ có thể làm được như vậy thôi ạ.
 
Cái login là họ phải kết nối tới sql server thì mới login được, còn logout là khi họ mất kết nối với sql server sau đó họ thoát ứng dụng đi trong thời điểm mất kết nối đó thì làm sao mà em biết được ạ. vì khi không có kết nối thì em không thể update câu lệnh vào sql server được. Hay là em chưa hiểu được cách của bác nhỉ? bác có thể nói rõ cho em được không ạ.
Khi thưc hiện lênh tới CSDL thì bạn phải mở kết nối tới Server, thực hiện xong thì bạn ngắt kết nối trên phần mềm. Còn vấn đề bạn mất kết nối không thực hiện đc câu lệnh thì do phía server có vấn đề, và phải giải quyết phía server. Còn bị vấn đề gì thì phải xem xét.
 
Khi thưc hiện lênh tới CSDL thì bạn phải mở kết nối tới Server, thực hiện xong thì bạn ngắt kết nối trên phần mềm. Còn vấn đề bạn mất kết nối không thực hiện đc câu lệnh thì do phía server có vấn đề, và phải giải quyết phía server. Còn bị vấn đề gì thì phải xem xét.
Ý tưởng của e như này ạ. Khi em login là em phải kết nối đến server kiểm tra ID và pass sau khi thành công update trạng thái stt_log=true . Và khi họ thoát form thì em update lại stt_log=false. Vấn đề ở chốt thoát form ý ạ. em đã để câu lệnh như vậy rồi nhưng như em nói khi mất kết nối từ ứng dụng đến server thì cái câu lệnh thoát form không thể update được mà trong khi đó người dùng vẫn thoát được ứng dụng bằng nhiều cách mà không có kết nối đến server đúng k ạ. Vậy thì làm sao em biết được họ đã thoát rồi vì dữ liệu trong server vẫn đang ghi nhận stt_log=true tại thời điểm họ login thành công.
Mong bác hướng dẫn em chi tiết với ạ.
 
Ý tưởng của e như này ạ. Khi em login là em phải kết nối đến server kiểm tra ID và pass sau khi thành công update trạng thái stt_log=true . Và khi họ thoát form thì em update lại stt_log=false. Vấn đề ở chốt thoát form ý ạ. em đã để câu lệnh như vậy rồi nhưng như em nói khi mất kết nối từ ứng dụng đến server thì cái câu lệnh thoát form không thể update được mà trong khi đó người dùng vẫn thoát được ứng dụng bằng nhiều cách mà không có kết nối đến server đúng k ạ. Vậy thì làm sao em biết được họ đã thoát rồi vì dữ liệu trong server vẫn đang ghi nhận stt_log=true tại thời điểm họ login thành công.
Mong bác hướng dẫn em chi tiết với ạ.
Vấn đề của bạn là ngta tắt form của bạn bằng cách nào đó mà code của bạn không hoạt động chứ chẳng liên quan gì đến kết nối.
 
Ý tưởng của e như này ạ. Khi em login là em phải kết nối đến server kiểm tra ID và pass sau khi thành công update trạng thái stt_log=true . Và khi họ thoát form thì em update lại stt_log=false. Vấn đề ở chốt thoát form ý ạ. em đã để câu lệnh như vậy rồi nhưng như em nói khi mất kết nối từ ứng dụng đến server thì cái câu lệnh thoát form không thể update được mà trong khi đó người dùng vẫn thoát được ứng dụng bằng nhiều cách mà không có kết nối đến server đúng k ạ. Vậy thì làm sao em biết được họ đã thoát rồi vì dữ liệu trong server vẫn đang ghi nhận stt_log=true tại thời điểm họ login thành công.
Mong bác hướng dẫn em chi tiết với ạ.
Trước mình có đọc đâu đó về session , bạn thử tìm hiểu xem, ghi nhận lại thời gian đăng nhập của người dùng, sau một khoảng thời gian nào đó không có thao tác gì thì tự log out hoặc sau bao nhiêu thời gian kể từ lúc đăng nhập thì log out, người dùng muốn thao tác tiếp phải đăng nhập lại. Đây là suy nghĩ của mình, mình chưa làm nên không biết có khả thi hay không.
 
Web KT
Back
Top Bottom