Eu tenho uma tabela vinculada herdada em um banco de dados msaccess que está vinculado a uma tabela sql-server.
A tabela vinculada está sendo sincronizada periodicamente com um conjunto diferente de tabelas que foram divididas por vários motivos e possuem mais colunas do que os usuários desejam ver. Eu gostaria de me livrar da tabela herdada e das dores de cabeça de sincronizá-la, criando uma visualização em vez de gatilhos para lidar com o acesso aos dados. Digamos que minha visão se pareça com:
Create view Compatibility_View
with schemabinding,view_metadata
as
select a.Name,a.col_1 aliasedName,a.col_2 aliasedName2
,b.col_1 aliasNamed3 ,convert(float,b.col_2) aliasedName4
,a.modified_date,a.modified_by
from dbo.some a
join dbo.other b
on a.some_Id = b.some_Id
where a.isActive = 1;
E eu tenho, em vez de gatilhos, que excluirão os registros e encaminharão as propriedades adequadamente.
Eu também atualizo automaticamente as colunas modify_date e modify_by. (Eles costumam ser manipulados por gatilhos posteriores na tabela legada).
Infelizmente, fazer esse segundo conjunto de requisitos faz com que o acesso emita um aviso após cada edição de que os dados foram alterados. Rastreando os problemas de acesso às consultas, parece que está fazendo uma atualização na exibição, certificando-se de que todas as outras colunas não foram alteradas. por exemplo
update "dbo"."Compatibility_View"
set "aliasedName"='v'
where "aliasedName2"=45 and "aliasedName3"='horse'
and "aliasedName4"=1.3e2 and "modified_date"='09/10/2014 12:35:00.00'
and "modified_by"='AD\SomeUser'
Como meu gatilho altera o acesso às colunas modified_date
e o modifed_by
visualiza como uma discrepância e envia um prompt de erro feio?
Os usuários gostam de ver as colunas modified_date
e modified_by
no acesso, então remover esta parte não é realmente uma opção. Como posso obter essas colunas na exibição sem que o acesso surte?
O Access usa os valores de todas as colunas para decidir se uma linha foi atualizada por algum outro processo entre o Access lendo a linha e subsequentemente gravando nessa linha.
Você pode evitar esse comportamento adicionando uma coluna TIMESTAMP à(s) tabela(s) em questão. O Access usará o valor TIMESTAMP único para determinar se a linha foi modificada por outra pessoa.
A única maneira de evitar essa mensagem de erro é não atualizar a linha antes de o Access tentar sua própria atualização. Eu faria o Access modificar os dois campos atualmente sendo modificados pelo gatilho.