Estou atualizando uma tabela de auditoria/log que é preenchida pelo gatilho quando uma tabela é atualizada. Minha intenção é usar as sys.objects.object_id
colunas for table name e column name na tabela de log, mas não é possível usar uma referência FK para as visualizações do sistema. Existe alguma alternativa útil para manter a integridade referencial na tabela?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Você pode usar um gatilho na tabela de log que reverte quando o object_id que está sendo inserido não for encontrado em sys.objects - já que os gatilhos são o mecanismo típico que usamos quando uma chave estrangeira não faz sentido ou não é possível (como manter integridade entre bancos de dados ou limites de instância).
Mas você realmente quer perder todos os dados porque uma coluna representa um objeto que não existe mais ou nunca existiu? (Talvez esteja tudo bem; eu não sei o que você está auditando/registrando.) Qual é a probabilidade de isso acontecer, já que o gatilho produz o object_id e o sistema não é conhecido por bagunçar?
Não tenho certeza se entendi o ponto de qualquer maneira; enquanto uma chave estrangeira para sys.objects impediria alguém de registrar informações sobre um objeto que não existe, a presença de apenas uma linha na tabela de registro tornaria impossível descartar esse objeto. (Talvez esteja tudo bem também, mas não parece sábio.)
Se o medo é que algum dia um usuário revisando o histórico de log chegue a um beco sem saída porque o objeto já foi descartado, um gatilho que garantiu que o objeto existia quando a linha foi inserida não o salvará desse cenário de qualquer maneira. Você precisaria de um gatilho DDL talvez, em
DROP_TABLE
, para que o histórico de log associado a essa tabela seja limpo ou o object_id seja movido para outro lugar para que você ainda possa rastrear o que essa tabela costumava ser.