Caso de negócio é.
1) Os usuários imprimem o documento em papel
2) os usuários carregam o papel impresso para o chefe, o chefe canta no papel
3) depois disso, os usuários vão ao administrador para assinar digitalmente esse papel.
Minha tarefa é ajudar o administrador a garantir de maneira fácil que não haja alterações entre o documento em papel e o documento digital.
O documento é escrito em três tabelas SQL.
Na 1ª integridade da tabela é string+data
Na 2ª integridade da tabela é combinação int+float
Na 3ª integridade da tabela é int+string.
Há outras colunas nestas tabelas que podem ser atualizadas livremente após o documento Boss sing sem a necessidade de Boss sing novamente.
Minha ideia é a partir dessas três tabelas/combinações fazer algum tipo de SHA ou CheckSum. O que será o mesmo enquanto não houver alterações no documento.
Não quero que minha soma de verificação seja infinita ou muito longa para que o administrador possa verificar facilmente se há violação da minha integridade personalizada.
Começo a pensar que posso for int - float make sum(int * folat)
For stings para cada letra, posso usar o número ASCII e fazer sum(int * (ascii(S)+ascii(T)+ascii(I)+ascii (N)+ascii(G))).
For date - int same make int * (date to int) Depois disso posso totalizar (soma) esses três números e converter para HEX. Mas talvez meu número esteja fora do alcance ou muito grande para comparação a olho nu.
Como posso encolher números muito grandes para serem facilmente legíveis e comparáveis por humanos? Existe outra maneira de garantir que não haja alterações em minhas colunas protegidas em um período de tempo?
Estou usando o servidor MSSQL2005/8. Meu mecanismo de geração de relatórios é, na maioria das vezes, SqlReportingServices, mas prefiro fazer esse login no nível do banco de dados e não no nível do relatório.
Não quero bloquear a edição do documento porque, às vezes, o chefe pressiona os usuários a voltar e corrigir o documento antes de assinar.
Eu também não posso empurrar o chefe para pegar o mouse na mão.
Você poderia apenas usar a função CHECKSUM, pois ela retorna um INT. Basta colocar as colunas nas quais você deseja fazer a soma de verificação para essas tabelas e ele exibirá o valor da soma de verificação para essas colunas. Aqui está um exemplo de AdventureWorks2012, mas esta função já existe há algum tempo. Nesse caso, tenho colunas de duas tabelas como parte da chamada de função de soma de verificação única.