Hi
Almost every method suggested has its drawback and nothing is absolute. As slighthaze pointed out, it depends on the need, the users proficiency, the security required behind the data and.or just protecting not knowledgeable people playing with it and so on.
If you are using DBC containers, you can use triggers to return .f. for adding, appending and deleting, so no one can play with individual tables. The trigger should look for a global variable initialised in your application. For example, in the start of Main.Prg
PUBLIC lDBFpass
lDBFpass = .t.
In all your triggers, add code..
IF lDBFpass
** more check for validation as required
RETURN .t.
ELSE
RETURN .f.
ENDIF
This will make sure that data is available to users, but as read only.
Now, if you want to protect the data from visiblity, then you have to use encryption rules/alogorithms.
Hiding a table is not workable. What if when one user is working, another one wants it or tries to change the attribute? How to make sure that all closes going thru your closing routine to hide tables? What if the user reboots and then after re-starting, reaches for the files?... there are so many questions here.
ramani

(Subramanian.G)