Você não precisa fazer absolutamente nada sobre isso.
As tabelas (e os dados armazenados nelas) são de propriedade do usuário A. Ninguém pode vê-las a menos que o usuário A concede certos privilégios a outros usuários, como o usuário B.
Isso pode ser feito concedendo privilégio de seleção, ou seja,
grant select on my_table to user_B;
e o usuário B buscaria dados como
select * from user_A.my_table;
O usuário B não poderá modificar os dados (pois não foi concedido inserir/atualizar/excluir).
Além disso, você (como usuário A) pode criar uma visualização que seleciona apenas parte dos dados, por exemplo
create view v_my_table as
select *
from my_table
where score > 4;
grant select on v_my_table to user_B;
Ao fazer isso, o usuário B veria apenas as linhas cuja pontuação fosse maior que 4.
Se houver o usuário C, ele não poderá ver absolutamente nada. Se você quiser que ele veja alguns dados, faça o que já fez com o usuário B - conceda certos privilégios.
No entanto, há uma opção para permitir que o usuário B "encaminhe" privilégios para outros usuários - você usaria
with grant option
, por exemplo. grant select on my_table to user_B with grant option;
Isso permitiria que o usuário B concedesse seleção a outros usuários, por exemplo
grant select on user_A.my_table to user_C;
Finalmente (falando sobre esta resposta), se houver muitos usuários aos quais você deseja conceder esses privilégios, você pode criar funções . Em seguida, você concederia privilégios a uma função e concederia função a outro(s) usuário(s). Ele permite que você modifique as funções dependendo dos seus desejos (e de outros usuários).
create role my_role;
grant select on my_table to my_role;
Por exemplo, para começar, você pode conceder
select
para my_role
e, em seguida, conceda my_role
aos usuários B, C e D. grant my_role to user_B;
grant my_role to user_C;
Mais tarde, você pode conceder
insert
para my_role
grant insert on my_table to my_role;
e todos os usuários receberam
my_role
seria automaticamente capaz de inserir linhas na my_table do usuário A.