We wanted to find empty tables in a Microsoft Access database. Below is a Python script that uses the PythonWin odbc module to find empty tables in an MS-Access database. Edit the required path to your database file by modifying the MDB_PATH variable.
Follow the note at the start of the script to configure your MS-Access database security if you get the following message: dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] Record(s) cannot be read; no read permission on 'MSYSOBJECTS'. in EXEC.
# List empty tables in an Access database by Kam-Hung Soh 2008. # Before using this script, you have to allow User and Group Permissions in Access. # 1. Open database. # 2. Select menu item Tools / Security / User and Workgroup Permissions. # 3. In 'User and Group Permissions' dialog: # 3.1. Select User/Group Name = Admin. # 3.2. Select Object Name = MSysObjects. # 3.3. Check 'Read Data' check box. # 3.4. Press OK button to close dialog box. import odbc MDB_PATH = r'<path>' conn = odbc.odbc(r"DRIVER={Microsoft Access Driver (*.mdb)}; Dbq=%s;" % MDB_PATH) cur = conn.cursor() cur.execute(r"SELECT name from MSYSOBJECTS WHERE name NOT LIKE 'MSYS%' AND type = 1") for x in cur.fetchall(): table_name = x[0] cur.execute(r'SELECT COUNT(*) FROM [%s]' % table_name) row = cur.fetchone() if row[0] == 0: print table_name + ' is empty' cur.close() conn.close()
Script Notes
MS-Access stores object metadata in a system table called MSysObjects. In this table, a user table object has a type value of '1' and its name doesn't start with 'MSys'. This script first gets a list of all user tables from MSysObjects, then counts the number of rows in those tables. If a table has no rows, the script prints the table name and a message.
The fetchall()
function always returns a list of tuples even if only one column is selected, so you have to extract the required column data using an array operator (e.g. x[0]
).
The table name in the second cur.execute()
SQL statement is delimited by square brackets in case the table name has whitespaces. Without these delimiters, you may see the following message: dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] Syntax error in WITH OWNERACCESS OPTION declaration. in EXEC.
No comments:
Post a Comment