Làm thế nào để Backup File Access mà không tạo Password

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

syquyen1987

Thành viên hoạt động
Tham gia
8/7/18
Bài viết
194
Được thích
43
Dear mọi người,

Hiện tại tôi có một file Access có pass bảo mật khi mở file. Tôi muốn người dùng sau khi vào cập nhật số liệu thì click thoát file là sẽ tạo một file Access Backup với không có pass bảo mật. Tôi chỉ làm được tạo file Backup nhưng vẫn có pass bảo mật. Nhờ mọi người giúp đỡ với ạ. Dưới đây là code hiện tại ạ

Mã:
Public Function CreateBackupFile() As Boolean

    Dim Source As String
    Dim Target As String
    Dim Obj As Object
    Dim Path As String
    Dim a
    
    Source = CurrentDb.Name
    'Path = "https://94z00-my.sharepoint.com/personal/q2828_on365_cc/Documents/09. Metallurgy Job Regristration/BACKUP FILE"
    Path = CurrentProject.Path
    'Path = "E:"
    Target = Path & "/BACKUP FILE/BKUP " & Format(Date, "yyyy-mm-dd") & ".accdb"
    
    Set Obj = CreateObject("Scripting.FileSystemObject")
    If Obj.FolderExists(Path) Then
        a = Obj.copyfile(Source, Target, True)
    Else
        Obj.CreateFolder (Path)
        a = Obj.copyfile(Source, Target, True)
    End If
    Set Obj = Nothing
    Set a = Nothing
End Function
 
Một câu hỏi đầy tính trào lộng.
 
Cái vụ này ngộ nhỉ????===\.===\.
Một cái ngộ nữa là database chuyên cho CSDL thì tại sao cứ mỗi nghiệp vụ nhập liệu lại phải sao lưu nguyên cái database? Mỗi ngày nhập liệu 100 lần chắc có 100 cái database...
 
Cái vụ này ngộ nhỉ????===\.===\.
Một cái ngộ nữa là database chuyên cho CSDL thì tại sao cứ mỗi nghiệp vụ nhập liệu lại phải sao lưu nguyên cái database? Mỗi ngày nhập liệu 100 lần chắc có 100 cái database...
"Ngộ" vì đây là một cách mới để mở khóa file miễn phí.
 
"Ngộ" vì đây là một cách mới để mở khóa file miễn phí.

Không phải thế bác.
Kinh nghiệm muốn trả lời được cho thớt thì cần am hiểu, thuộc lòng "quá khứ" của thớt, biết thớt đã và đang làm gì. Cái này ở GPE không mấy ai làm được.

Cái tạo tập tin lưu trữ của thớt là chạy trên chính tập tin của thớt và 3 người nữa sử dụng. Khi cần tạo bản sao lưu trữ thì ấn nút chạy lệnh ở bài #1.
Tuy nhiên, cái tập tin đang sử dụng có đặt mật khẩu bảo vệ tập tin (password to open file), trong khi code thớt viết là sao chép tập tin từ ổ đĩa. Vậy nên kết quả tập tin sao lưu vẫn giữ nguyên mật khẩu.
Thớt mong muốn tạo tập tin sao lưu không có mật khẩu mở file như cái code ở bài #1.
 
Không phải thế bác.
Kinh nghiệm muốn trả lời được cho thớt thì cần am hiểu, thuộc lòng "quá khứ" của thớt, biết thớt đã và đang làm gì. Cái này ở GPE không mấy ai làm được.

Cái tạo tập tin lưu trữ của thớt là chạy trên chính tập tin của thớt và 3 người nữa sử dụng. Khi cần tạo bản sao lưu trữ thì ấn nút chạy lệnh ở bài #1.
Tuy nhiên, cái tập tin đang sử dụng có đặt mật khẩu bảo vệ tập tin (password to open file), trong khi code thớt viết là sao chép tập tin từ ổ đĩa. Vậy nên kết quả tập tin sao lưu vẫn giữ nguyên mật khẩu.
Thớt mong muốn tạo tập tin sao lưu không có mật khẩu mở file như cái code ở bài #1.
Tôi không có thời gian và khả năng để tìm hiểu sâu việc mà bạn nói, nhưng nếu người ta không trao cho mình chìa khóa hoặc chứng nhận sở hữu ngôi nhà mà bảo mình cứ mở cửa ngôi nhà đi thì liệu ai dám mở?
 
Cái vụ này ngộ nhỉ????===\.===\.
Một cái ngộ nữa là database chuyên cho CSDL thì tại sao cứ mỗi nghiệp vụ nhập liệu lại phải sao lưu nguyên cái database? Mỗi ngày nhập liệu 100 lần chắc có 100 cái database...
Thưa anh, là mỗi ngày sẽ chỉ sao lưu một file Database ạ, nếu trong ngày nhập liệu nhiều lần thì sẽ ghi đè ạ. Anh làm ơn cho hỏi là làm sao để sao lưu file mà loại bỏ password ạ, vì em muốn tạo file Backup này để cho mọi người vào xem data ạ.
Bài đã được tự động gộp:

Không cần thêm biến thế.

Call Obj.copyfile(Source, Target, True)

Hoặc
Obj.copyfile Source, Target, True



Giải thuật: Mở file lên rồi gỡ mật khẩu đi thôi.
Vì mỗi lần như thế thì em lại phải làm thủ công ạ, mỗi ngày sẽ có một file Backup (trong ngày nhập liệu nhiều lần sẽ ghi đè), mục đích File Backup này để mọi người vào xem dữ liệu ạ, nên em muốn loại bỏ mật khẩu khi tạo sao lưu ạ. Anh biết giúp em với ạ
 
Tôi chỉ nói theo suy nghĩ của mình thôi. Tôi có 1 file không mở được do vướng mật khẩu open file. Tôi không thể nói rằng tôi quên mk được, chuyện đó quen quá rồi. Do vậy tôi phải đi đường khác để mở, nên tôi nghĩ ra cách backup.
Tuy nhiên cách gì thì cũng phải có mk cũ thì mới có thể đặt lại mk hoặc xoá mk được. Do đó tôi bí rồi.
Một code đặt lại mk chính thống (để làm gì sau đó không cần biết) thì không thể không có đối số old password!
 
Lần chỉnh sửa cuối:
Tôi không có thời gian và khả năng để tìm hiểu sâu việc mà bạn nói, nhưng nếu người ta không trao cho mình chìa khóa hoặc chứng nhận sở hữu ngôi nhà mà bảo mình cứ mở cửa ngôi nhà đi thì liệu ai dám mở?
File nhập liệu là file chính, và em đã tạo pass để mọi người không thể vào được. Chỉ 1 người nhập liệu (biết pass để mở) khi bấm thoát chương trình là sẽ tạo một file Backup, tuy nhiên file Backup này có pass bảo vệ như file chính. Em muốn sao lưu file Backup này mà không có pass thì làm thế nào ạ, anh biết thì làm ơn giúp em với ạ
 
Rảnh bà tám làm bánh vẽ ra cho mà làm thôi còn tôi luôn luôn làm biếng

1/ dùng code copy File A tới nơi lưu nó xong

2/ dùng ADODB hay DAO hay xxxx tùy thích xóa cái Pass Open của file mới lưu đó

3/ dùng tay mở nó lên xóa Pass Open đi là xong

4/ thay vì lên đây hỏi à ơi hoài không xong thì hỏi con ChatGPT nó vẽ cho vài đường cơ bản xong từ đó dò cũng ra thôi

Tôi hỏi dùm cho dò đi he

1687338167476.png

Mã:
Sub XoaMatKhauAccess()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    
    ' Thay đổi đường dẫn đến tệp dữ liệu Access ở dòng sau
    Dim dbPath As String
    dbPath = "Đường_dẫn_đến_tệp_Data.accdb"
    
    ' Mở kết nối đến tệp dữ liệu Access
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
    
    ' Xóa mật khẩu
    cn.Execute "ALTER DATABASE PASSWORD NULL"
    
    ' Đóng kết nối
    cn.Close
    
    MsgBox "Đã xóa mật khẩu thành công!"
End Sub
 
Lần chỉnh sửa cuối:
Thưa anh, là mỗi ngày sẽ chỉ sao lưu một file Database ạ, nếu trong ngày nhập liệu nhiều lần thì sẽ ghi đè ạ. Anh làm ơn cho hỏi là làm sao để sao lưu file mà loại bỏ password ạ, vì em muốn tạo file Backup này để cho mọi người vào xem data ạ.

Việc xoá mật khẩu Access database đơn giản nhưng làm theo con chatGPT hướng dẫn ở trên tới Tết Công-gô mới xoá được nhe.
Nhưng trước khi xử lý vụ xoá Pass tôi thật sự rất thắc mắc là bạn phân phối, sử dụng Access database để nhập liệu nhiều người dùng như thế nào mà phải thêm công đoạn lãng phí là xoá Pass như yêu cầu ở trên. Bạn không tách Database ra làm Font end và Back end?
- Database phải bảo mật, ai muốn xem thì cấp quyền đăng nhập để xem, cần gì xoá mật khẩu database.
- Mà xem dữ liệu thì xem qua Form chứ xem trực tiếp Database làm gì??? táy máy, lỡ tay xoá dữ liệu thì lại rách việc.
 
Lần chỉnh sửa cuối:
Việc xoá mật khẩu Access database đơn giản nhưng làm theo con chatGPT hướng dẫn ở trên tới Tết Công-gô mới xoá được nhe.
Nhưng trước khi xử lý vụ xoá Pass tôi thật sự rất thắc mắc là bạn phân phối, sử dụng Access database để nhập liệu nhiều người dùng như thế nào mà phải thêm công đoạn lãng phí là xoá Pass như yêu cầu ở trên. Bạn không tách Database ra làm Font end và Back end?
- Database phải bảo mật, ai muốn xem thì cấp quyền đăng nhập để xem, cần gì xoá mật khẩu database.
- Mà xem dữ liệu thì xem qua Form chứ xem trực tiếp Database làm gì??? táy máy, lỡ tay xoá dữ liệu thì lại rách việc.
"Bạn không tách Database ra làm FE và BE?", em có ý định làm vậy, nhưng em có mắc 1 chỗ là: Access_BE là cần link tới Access_FE để lấy "số phiếu" nối tiếp của hệ thống trước khi tiến hành nhập liệu số phiếu đó ạ
"Database phải bảo mật, ai muốn xem thì cấp quyền đăng nhập để xem, cần gì xoá mật khẩu database." Nếu em cấp mật khẩu Backup File thì họ sẽ biết mật khẩu file chính (vì cùng là 1), và em không muốn thế vì khi họ vào file chính, sau đó người nhập liệu file chính cũng vào để cập nhật số liệu thì khi lưu số liệu sẽ tạo ra một file sao lưu ạ (không lưu được số liệu vào file chính). Tất nhiên là em cũng đã viết thêm code Environ$("computername") là sau khi họ biết mật khẩu thì nếu không đúng tên máy thì sẽ tự động thoát ạ (Docmd.quit theo điều kiện)
"Mà xem dữ liệu thì xem qua Form chứ xem trực tiếp Database làm gì??? táy máy, lỡ tay xoá dữ liệu thì lại rách việc." File Backup của em là khi mở thì Form sẽ xuất hiện để xem ạ, họ sẽ không tiếp cận được Database vì em đã vô hiệu hóa nút X tắt form rồi ạ (chỉ bấm button mới tắt Form được ạ)
Em xin nói thêm là Công ty em có mua Microsoft cho 5 người dùng, không phải là mạng chung của Công ty, nên nhiều lúc OneDrive đồng bộ và mạng kém thì em nghĩ cũng không ổn trong việc đồng bộ dữ liệu tức thì được ạ
 
nhưng em có mắc 1 chỗ là: Access_BE là cần link tới Access_FE để lấy "số phiếu" nối tiếp của hệ thống trước khi tiến hành nhập liệu số phiếu đó ạ
Tôi chưa hiểu lắm vấn đề trên. Bạn có nói ngược không? Access_BE chỉ lưu các Table dữ liệu, Access_FE là giao diện xử lý, để người dùng tương tác tới file dữ liệu BE. Do đó FE sẽ Linked Table tới BE, từ FE sẽ kết nối dữ liệu, lấy (tìm kiếm, tạo mới...) số phiếu và nhập liệu, nói chung không cho người dùng thao tác trực tiếp trên Access_BE. Do đó file BE có đặt mật khẩu thì cũng không bị gì mà còn bảo mật hơn nếu người khác lấy được file BE cũng không xem được dữ liệu bên trong nó. Còn về phía FE thì bạn phân quyền người dùng để đăng nhập và thao tác dữ liệu. Muốn cho bao nhiêu người dùng thì chỉ cần copy cái file FE đó lưu trên máy tính của họ và cấp user/pass đăng nhập. Mật khẩu database thì chỉ mình bạn biết và lưu trong code VBA, muốn phức tạp hợn thì mã hoá và lưu luôn trong table cũng được, khi FE kết nối với BE thì sẽ code để giải mã và tạo kết nối.
Nói chung mỗi người dùng sẽ được cấp User/Pass riêng để đăng nhập và xử lý dữ liệu. Còn BE Database thì vẫn thiết lập mật khẩu chỉ mình bạn biết.

Screen Shot 2023-06-22 at 11.33.10.png. Screen Shot 2023-06-22 at 11.37.37.png FE với linked table
 
Lần chỉnh sửa cuối:
Tôi chưa hiểu lắm vấn đề trên. Bạn có nói ngược không? Access_BE chỉ lưu các Table dữ liệu, Access_FE là giao diện xử lý, để người dùng tương tác tới file dữ liệu BE. Do đó FE sẽ Linked Table tới BE, từ FE sẽ kết nối dữ liệu, lấy (tìm kiếm, tạo mới...) số phiếu và nhập liệu, nói chung không cho người dùng thao tác trực tiếp trên Access_BE. Do đó file BE có đặt mật khẩu thì cũng không bị gì mà còn bảo mật hơn nếu người khác lấy được file BE cũng không xem được dữ liệu bên trong nó. Còn về phía FE thì bạn phân quyền người dùng để đăng nhập và thao tác dữ liệu. Muốn cho bao nhiêu người dùng thì chỉ cần copy cái file FE đó lưu trên máy tính của họ và cấp user/pass đăng nhập. Mật khẩu database thì chỉ mình bạn biết và lưu trong code VBA, muốn phức tạp hợn thì mã hoá và lưu luôn trong table cũng được, khi FE kết nối với BE thì sẽ code để giải mã và tạo kết nối.
Nói chung mỗi người dùng sẽ được cấp User/Pass riêng để đăng nhập và xử lý dữ liệu. Còn BE Database thì vẫn thiết lập mật khẩu chỉ mình bạn biết.

View attachment 291768. View attachment 291769 FE với linked table
Vâng, em chưa chính thức thao tác Split Database nên em chưa rõ lắm ạ. Em có 1 vấn đề khúc mắc như sau: Có 3 người A, B, C nhập liệu vào mỗi file, và 3 file này sẽ được link vào file chủ. Người A đăng kí để tạo số phiếu 003, thì người B đăng kí sẽ tạo số phiếu nối tiếp là 004, và người C sẽ là 005, và người B tiếp tục làm thì số phiếu là 006 (Người A, B, C sẽ không theo theo lần lượt làm, và làm ngẫu nhiên khi cần), em không biết giải quyết vấn đề này thế nào ạ
Bài đã được tự động gộp:

Tôi chưa hiểu lắm vấn đề trên. Bạn có nói ngược không? Access_BE chỉ lưu các Table dữ liệu, Access_FE là giao diện xử lý, để người dùng tương tác tới file dữ liệu BE. Do đó FE sẽ Linked Table tới BE, từ FE sẽ kết nối dữ liệu, lấy (tìm kiếm, tạo mới...) số phiếu và nhập liệu, nói chung không cho người dùng thao tác trực tiếp trên Access_BE. Do đó file BE có đặt mật khẩu thì cũng không bị gì mà còn bảo mật hơn nếu người khác lấy được file BE cũng không xem được dữ liệu bên trong nó. Còn về phía FE thì bạn phân quyền người dùng để đăng nhập và thao tác dữ liệu. Muốn cho bao nhiêu người dùng thì chỉ cần copy cái file FE đó lưu trên máy tính của họ và cấp user/pass đăng nhập. Mật khẩu database thì chỉ mình bạn biết và lưu trong code VBA, muốn phức tạp hợn thì mã hoá và lưu luôn trong table cũng được, khi FE kết nối với BE thì sẽ code để giải mã và tạo kết nối.
Nói chung mỗi người dùng sẽ được cấp User/Pass riêng để đăng nhập và xử lý dữ liệu. Còn BE Database thì vẫn thiết lập mật khẩu chỉ mình bạn biết.

View attachment 291768. View attachment 291769 FE với linked table
Với lại cho em hỏi thêm 1 ý nữa ạ. Nhóm em dùng OneDrive, khi xong thì đợi 2-3 phút để OneDrive đồng bộ, như vậy trong quá trình chưa đồng bộ xong mà người dùng đăng kí để lấy số phiếu nối tiếp thì có vấn đề gì không ạ. Em cảm ơn
 
Nhóm em dùng OneDrive, khi xong thì đợi 2-3 phút để OneDrive đồng bộ, như vậy trong quá trình chưa đồng bộ xong mà người dùng đăng kí để lấy số phiếu nối tiếp thì có vấn đề gì không ạ.
Thế thì có mà phang teo luôn chứ làm ăn gì nữa.
Muốn làm việc nhóm đồng bộ từ xa thì phải có nơi chung cùng kết nối ngon lành theo thời gian thực.
Thường thì dùng hàng trả phí.
Hàng miễn phí thì phải chịu khó cày, ví dụ dùng Google sheets làm nơi chứa dữ liệu chẳng hạn. Bữa nào rảnh mình úp cho xem video đồng bộ thời gian thực giữa Excel và Google Sheets bằng API tự dựng.
 
Vâng, em chưa chính thức thao tác Split Database nên em chưa rõ lắm ạ. Em có 1 vấn đề khúc mắc như sau: Có 3 người A, B, C nhập liệu vào mỗi file, và 3 file này sẽ được link vào file chủ. Người A đăng kí để tạo số phiếu 003, thì người B đăng kí sẽ tạo số phiếu nối tiếp là 004, và người C sẽ là 005, và người B tiếp tục làm thì số phiếu là 006 (Người A, B, C sẽ không theo theo lần lượt làm, và làm ngẫu nhiên khi cần), em không biết giải quyết vấn đề này thế nào ạ
Làm việc với CSDL Access đa người dùng mà bạn không xài tính năng ưu việt của nó là Split Database thì là một thiếu sót lớn.
Việc nhập liệu đa người dùng sẽ phải gặp tình trạng nhập trùng số phiếu khi 2, 3 người cập nhật dữ liệu cùng lúc, hiếm khi nhưng vẫn có và phải có giải pháp chống nhập trùng cho nó. Nếu trùng, Access sẽ nhảy đổng lên báo lỗi ngay, người dùng không biết gì sẽ lúng túng khi gặp báo lỗi này, do đó phải có một số thủ thuật xử lý phía sau hậu trường để việc cập nhật dữ liệu suôn sẽ mà không báo lỗi. Tôi cũng có một bài viết về thủ thuật này bên một diễn đàn về Access. Sơ bộ nó như thế này:
- Không tạo mã số phiếu ngay từ đầu nhập liệu mà chỉ tạo khi bấm nút [Lưu]. Nếu bạn tạo trước, chiếm một số phiếu nào đó trước rồi mới nhập liệu, sau đó có phát sinh, không lưu record thì số phiếu sẽ bị nhảy cóc do có người dùng khác lấy số phiếu kế tiếp để nhập rồi.
- Tạo môt table riêng chỉ để lưu số thứ tự mới nhất, khi người dùng thứ nhất (User 1) bấm [Lưu], code sẽ kiểm tra table này, lấy số phiếu và khoá (lock) cái table đó lại, không cho User 2 lấy.
- Khi 2, 3 User cùng lúc bấm nút [Lưu], User nào tới trước sẽ lấy trước, khi đó code các User còn lại phát hiện Table lấy số thứ tự bị Lock sẽ chạy Timer câu giờ để Users chờ trong giây lát, sau đó kiểm tra tiếp nếu lấy được số thứ tự mới thì cho [Lưu]. Nói là câu giờ chứ thời gian chỉ tính bằng milisecond, người dùng cũng khó nhận thấy sự khác biệt.


Với lại cho em hỏi thêm 1 ý nữa ạ. Nhóm em dùng OneDrive, khi xong thì đợi 2-3 phút để OneDrive đồng bộ, như vậy trong quá trình chưa đồng bộ xong mà người dùng đăng kí để lấy số phiếu nối tiếp thì có vấn đề gì không ạ. Em cảm ơn

Đối với Access Database làm Back End cho nhiều người dùng, tôi tuyệt đối không khuyến khích dùng các dịch vụ lưu trữ đám mây như One Drive, Google Drive, Drop Box để lưu Bạck End Database. Nếu chỉ một người dùng thì không thành vấn đề.
Cơ chế đồng bộ của các dịch vụ trên nó chỉ kiểm tra xem file nào mới nhất (dựa trên Date modified) của các máy con, rồi đồng bộ lên máy chủ đám mây. Trong khi đó đối với Access database, việc lưu một dòng dữ liệu (record) nó không giống như lưu một dòng trong file Excel, text. Bộ máy của Access khi nhập lệnh lưu Record, nó sẽ kiểm tra, thay đổi, đồng bộ lại Index, thay đổi dữ liệu của các Field khác trong Table khác mà nó có tạo quan hệ (Relationship) v.v..Vì vậy khi User1 đang cập nhật dữ liệu, bộ máy Access chưa kịp xử lý xong thì Database đó bị đồng bộ bởi User2 cũng đang thao tác nhập liệu vào cùng một Table --> dẫn đến việc cập nhật dữ liệu không hoàn tất, dễ gây sai dữ liệu, nặng thì hỏng luôn Database (Access sẽ báo lỗi "Database could not recognized"). Nói chung là không nên dùng.
Muốn tạo ứng dụng nhiều người dùng, bạn chỉ cần nâng cấp nó lên SQL Server, PosgreSQL là có thể thoải mái sử dụng nhập liệu, thao tác qua internet, không bị hư CSDL. Phía giao diện người dùng (Font End) thì cứ thiết kế Access cho nhanh, code không thay đổi gì nhiều lắm.
 
Web KT
Back
Top Bottom