Estou trabalhando com o Microsoft Reporting Services 2008. Em nosso banco de dados, temos um pequeno grupo de alunos confidenciais que precisam ser levados em consideração para diversas consultas. Se eles forem um aluno confidencial, o banco de dados precisa basicamente não retornar nada. Atualmente, fazemos algo ao longo das linhas de:
select
case
when CONFIDENTIALITY_IND = 'Y' or :EmployeeClass = 'XA'
then 'CONFIDENTIAL'
else db.table.name
end as name
from
db.student
Isso não é grande coisa para uma consulta tão pequena, mas a maioria deles retorna muitos campos (geralmente mais de 20) e não sou fã de tantas instruções de caso por razões óbvias. Por causa de como o Reporting Services funciona, também não posso fazer uma substituição geral, ela deve ser feita em todos os campos.
Existe um método mais eficiente onde eu poderia substituir todos os valores na linha por 'Confidencial' em uma única declaração de caso, ou pelo menos algo mais elegante?
Edit: Para esclarecer, não existe apenas este campo no select. Escrevi apenas um para o exemplo, mas na produção, alguns relatórios procuram exibir uma grande quantidade de colunas. Estou tentando evitar fazer duas comparações em cada coluna para relatórios que podem retornar conjuntos de dados bastante grandes.
o que você pode fazer é escrever dois stored procedures com a seguinte lógica:
Espero ter entendido seu problema corretamente. Este seria o meu caminho
No Oracle 11.2.0.3, o Virtual Private Database permite ocultar linhas ou colunas. Por exemplo:
Depois de adicionar essa política, o Oracle injeta o predicado retornado por check_confidentiality em todas as consultas na tabela de alunos.
Isso não é o mesmo que substituir todos os valores por 'CONFIDENCIAL', mas talvez seja aceitável no seu caso. É possível implementar a redação condicional na função check_confidentiality (por exemplo, verificando se o usuário é membro de uma função que permite acesso total).
Outra abordagem seria criar a visão UNION ALL:
Onde a verificação de privilégio pode ser uma subconsulta ou uma chamada para o Application Context (o que permitiria a passagem de parâmetros para exibição)