using System;
using System.Data.OleDb;
using Serilog;
namespace SyncEngine.Access
{
///
/// Grants Jet/ACE SELECT on system tables (same DDL as Access VBA CurrentProject.Connection.Execute).
///
internal static class AccessSystemTablePermissions
{
private static readonly string[] SystemTables = { "MSysObjects", "MSysRelationships" };
/// OleDb GRANT only works with user-level security (workgroup .mdw). Prefer Access.Application.
public static bool TryGrantSelect(OleDbConnection conn, string userName, ILogger logger)
{
var user = string.IsNullOrWhiteSpace(userName) ? "Admin" : userName.Trim();
var grantedAny = false;
foreach (var table in SystemTables)
{
try
{
// GRANT SELECT ON MSysObjects TO Admin;
var ddl = string.Format("GRANT SELECT ON {0} TO {1};", table, user);
using (var cmd = new OleDbCommand(ddl, conn))
{
cmd.ExecuteNonQuery();
}
logger.Information("Granted SELECT on {Table} to {User}", table, user);
grantedAny = true;
}
catch (Exception ex)
{
logger.Debug(
"GRANT SELECT on {Table} via OleDb skipped (requires workgroup .mdw): {Message}",
table,
ex.Message);
}
}
return grantedAny;
}
}
}