Мне кажется Вы либо как-то слишком перемудрили с логикой, либо подошли к вопросу не с той стороны. К тому же, Вы не указали, касательно какой конкретной БД этот вопрос.
Например, в MySQL'е (в данный момент проверят на MariaDB, но думаю оригинальный MySQL работает так же), если нужно ограничить доступы - это можно сделать на уровне пользователей самой БД, причём выставить отдельные ограничения на каждые: Базу -> таблицу -> отдельную колонку.
Если же Вам нужно ещё жестче ограничить данные - я бы рекомендовал добавлять данные о доступах к самим данным непосредственно.
Например, если бы мы использовали
PostgreSQL: в таблицу "news", к каждой новости я бы добавлял список пользователей, которые могут читать конкретно эту новость, в отдельную колонку типа "массив" со списком ID пользователей, что бы иметь возможность делать такую выборку на уровне "чистых запросов" или просто воспользовался бы механизмом
row level security (пока не приходилось пользоваться таким, но думаю это как раз то, о чём Вы говорите).
А если
MySQL: создал бы для каждой такой таблицы создал бы таблицу-спутник в которой были бы прописаны права на каждую отдельную запись, по такому же принципу, как описано выше. Или попробовал бы реализовать аналогичную схему (как описал в варианте для PosgtreSQL), только роль поля-массива выполняло бы JSON-поле (насколько это сработало бы и насколько бы оно работало быстро, если заработало бы - точно сказать не могу, в MySQL я так делать ещё не пробовал, но в теории так сделать можно).
В Вашем варианте мне решительно не нравится то, что Вы храните
имена таблиц в другой таблице. Таким образом, эти имена с большей вероятностью невозможно будет использовать внутри SQL-запроса, что в свою очередь создаёт серьёзную специфику при работе с такой БД, которую я бы настоятельно рекомендовал избегать, в частности что бы гарантировать корректность прав между запросами - нужно будет каждый запрос на SELECT оборачивать в транзакцию, как минимум...
P.S. Ещё
вот тут описывают некоторую реализацию row level security для MySQL'а.