private static void UpdateUserGrants(this IQueryContext context, DbObjectType objectType, ObjectName objectName,
			User user, User granter, Privileges privileges, bool withOption)
        {
            // Revoke existing privs on this object for this grantee
            context.RevokeAllFromUserOn(objectType, objectName, user, granter, withOption);

            if (privileges != Privileges.None) {
                // The system grants table.
                var grantTable = context.GetMutableTable(SystemSchema.UserGrantsTableName);

                // Add the grant to the grants table.
                var rdat = grantTable.NewRow();
                rdat.SetValue(0, (int)privileges);
                rdat.SetValue(1, (int)objectType);
                rdat.SetValue(2, objectName.FullName);
                rdat.SetValue(3, user.Name);
                rdat.SetValue(4, withOption);
                rdat.SetValue(5, granter.Name);
                grantTable.AddRow(rdat);

                user.CacheObjectGrant(objectName, privileges);
            }
        }
        public static Privileges GetUserGrants(this IQueryContext context, User user, DbObjectType objectType,
			ObjectName objectName, bool includePublic = false, bool onlyOption = false)
        {
            Privileges privileges;
            if (!user.TryGetObjectGrant(objectName, out privileges)) {
                privileges = context.GetUserGrants(user.Name, objectType, objectName);
                user.CacheObjectGrant(objectName, privileges);
            }

            return privileges;
        }