I had the similar problem.
I granted SELECT permission to database objects to a group. The users could query the tables, however, they couldn't see the table lists when they tried to expand tables in a database. The error message they were getting:
"The SELECT permission was denied on the object 'tables', database 'mssqlsystemresource', schema 'sys'."
When I was searching in Google, I found this article and executed the following query.
USE master
GO
GRANT SELECT ON [mssqlsystemresource].[sys].[tables] TO PUBLIC
GO
I However, received the following error:
"Cannot find the object 'tables', because it does not exist or you do not have permission."
Then I turned the trace ON and found that when the user tries to expand the table list, it executes a T-SQL batch behind the scene which uses SELECT from the object sys.tables and that is where the error was coming from. Then I ran the following query:
USE user_DB
GO
GRANT SELECT ON [mssqlsystemresource].[sys].[tables] TO PUBLIC
GO
It failed again with the error:
"Cannot find the object 'tables', because it does not exist or you do not have permission."
Finally, the following query worked:
USE user_DB
GO
GRANT SELECT ON [sys].[tables] TO PUBLIC
GO
Glad that it worked finally 🙂