home

Linked Tables: Giving Users Permissions to Change Path

Sunday, April 06, 2003 16:01:20
Related: Automatically Refreshing Paths to Linked Tables

Whether you use the conventional built-in linked table manager for changing the path to the linked tables, or the code for automating this task, one problem exists--as it stands, only administrators can change the path to linked tables. Most likely, you will want certain types of end-users to be able to change this path as well. There is code in Section 14 of Microsoft's Security FAQs which allows you to do just this. (The link above will carry you to this section of Microsoft's Security FAQs.)

One particular observation: this code requires you to execute a function for each and every linked table you have in your database, a tedious process. So I tacked on some extra code on the bottom for highly automating this process. (Other code can be found by searching microsoft.public.access.tablesdbdesign dated April 4th through April 6th 2003, thread name Difficulty Refreshing Linked Tables).

  1. Create a new module. Enter the following code:
     Function faq_SetPermissions(strTable As String, strSourceDB As String, strUsrName As String)
       ' Derived from section 14 of Microsoft's Security FAQs
       ' This function will set permissions on the source table so that
       ' you can use the RefreshLink method to reattach tables. It grants
       ' Read Data permissions on the source table, Open/Run permissions
       ' on the source database and full permissions in the destination
       ' database on all tables and queries. You need to be a member of the
       ' Admins group to run this code.
       '
       ' Parameters:
       '       strTable
       '           Name of the table for permissions to be set. Assumes the
       '           table named the same in both source and destination db.
       '       strSourceDB
       '           Fully-qualified name of the source database
       '       strUsrName
       '           Name of group or user you want to be able to
       '           use RefreshLink
       '
           Dim db As Database
              Dim con As Container
              Dim doc  As Document
              Dim ws As Workspace
           Set ws = DBEngine.Workspaces(0)
        
           ' set default full permissions in destination
           ' (current) database for new tables
           Set db = CurrentDb()
           Set con = db.Containers("Tables")
           con.userName = strUsrName
           con.Permissions = DB_SEC_FULLACCESS
        
           ' set full permissions for the linked table
           ' in the destination database
              Set doc = con.Documents(strTable)
              doc.userName = strUsrName
           doc.Permissions = DB_SEC_FULLACCESS
        
           ' Set open database permissions for the source database
           Set db = ws.OpenDatabase(strSourceDB)
           Set con = db.Containers("Databases")
           Set doc = con.Documents("MSysdb")
           doc.userName = "Users"
           doc.Permissions = doc.Permissions Or DB_SEC_DBOPEN
        
           ' Set read data permissions for the base table
           Set con = db.Containers("Tables")
           Set doc = con.Documents(strTable)
           doc.userName = strUsrName
           doc.Permissions = doc.Permissions Or DB_SEC_RETRIEVEDATA
       End Function
    
    Function givepermissionslrh()
    ' Executes the above module--derived from Microsoft's Security FAQ--much more quickly
    ' as the above would have to be re-executed for every table in the database
    Dim dbs As Database
    Dim tdf As TableDef
    
    Set dbs = CurrentDb
    Set tdf = dbs.TableDefs("tblApprovalGuidelines") ' Enter name of your 1st table
    
    For Each tdf In dbs.TableDefs
       ' Next line specifies--user specific--which tables exist in the table
       ' database window. I have specified that tblTmpPO and tblTmpInv should be skipped
       ' since they are "local" tables and have very limited usage
       If tdf.Name Like "tbl*" And tdf.Name <> "tblTmpInv" And tdf.Name <> "tblTmpPO" Then
           Call faq_SetPermissions(tdf.Name, "C:\db\po_invoices_be.mdb", "Full Data Users")
       End If
    Next tdf
    
    End Function
    
  2. Save this module, name it something like basRefreshTableLinksGivePermissionsToUsers
  3. Notice in the Call statement near the end, the path to the backend is entered, then the name of the GROUP whom I want to grant these permissions to
  4. Simply type Call givepermissionslrh() to execute the code