Introdução
Talvez você já tenha reparado que a base HSAUDIT não tem uma tarefa de expurgo já configurada na maioria das versões do HealthShare, e isso pode ser um problema já que ela tem mapeamentos de globais em vários namespaces.
Se você notou que essa base está ocupando muito espaço em disco e está com dificuldades de limpá-la, esse artigo é para você.
Se você já tem uma ideia de como fazer isso, mas está utilizando uma versão mais antiga do HealthShare, onde a tarefa não existe pronta, ou o PurgeByDaysToKeep não existe, esse artigo também é para você.
Passo a passo
Criar a classe de tarefa
Crie uma classe de expurgo que estende de %SYS.Task.Definition no namespace %SYS. Eu usei o nome custom.Task.Purge.ExpurgoHSAUDIT. Defina o parâmetro TaskName como uma string com o nome da tarefa e a propriedade KeepDays como a quantidade de dias para manter. Defina o método OnTask().
Class custom.Task.Purge.ExpurgoHSAUDIT Extends %SYS.Task.Definition
{
Parameter TaskName = "PurgeHSAUDIT";
Property KeepDays As %Integer;
Method OnTask() As %Status
{}
}
ObjectScriptObjectScript
Dentro do método, vamos mudar de namespace para onde as globais de HSAUDIT estejam mapeadas e queremos expurgar. Vamos definir a data a de << KeepDays >> dias atrás e expurgar os dados como veremos a seguir.
A HSAUDIT é gerida pelo pacote HS_IHE_ATNA_Repository, onde vamos encontrar algumas classes e métodos úteis para o expurgo. Primeiro, verificamos em HS.IHE.ATNA.Repository.Exclusion se os dados estão OK para expurgo com o método OKToPurge(). Depois, selecionamos os dados para expurgo na tabela HS_IHE_ATNA_Repository.Aggregation e deletamos com o método PurgeEvent() da classe Exclusion referida acima.
Method OnTask() As %Status
{
Set tStatus = $$$OK
Set tDate = $ZDATETIME($PIECE($HOROLOG, ",", 1)-..KeepDays,3)
Do $ZUTIL(5,"NamespaceEDGE")
If '##class(HS.IHE.ATNA.Repository.Exclusion).OKToPurge()
{
Set tStatus = $System.Status.Error(5001, "HS.IHE.ATNA.Repository.Exclusion returned NOT OK TO PURGE")
Quit tStatus
}
Set tSQL="Select ID from HS_IHE_ATNA_Repository.Aggregation where IndexedDate < ?"
SET tStatement = ##class(%SQL.Statement).%New()
Set tStatus=tStatement.%Prepare(tSQL)
If $System.Status.IsError(tStatus) Quit
Set tResultSet=tStatement.%Execute(pDate)
While tResultSet.%Next()
{
Set tId=tResultSet.%Get("ID")
Do ##class(HS.IHE.ATNA.Repository.Exclusion).PurgeEvent(tId)
}
Quit tStatus
}
}
ObjectScriptObjectScript
Por fim, retornamos um status. Você pode configurar esse mesmo método para repetir o código para todos os namespaces, ou definir o namespace como propriedade e configurar várias tarefas para cada namespace no próximo passo.
Configurar a tarefa
Abra o Portal de Administração da instância. Vá para Operação do Sistema > Gerenciador de Tarefas > Nova tarefa. Escolha a tarefa de nome definido no parâmetro TaskName no passo anterior. Escolha o namespace %SYS e a quantidade de dias a manter no parâmetro KeepDays. Escolha um usuário com acesso ao namespace %SYS e aos outros acessados na tarefa.
Selecione Avançar e defina a frequência de execução da tarefa.
Cuidado
Ao configurar essa tarefa no seu Edge, pode haver uma perda irrecuperável ao apagar os dados de auditoria. Leia com atenção a documentação antes de executá-la, em especial o aviso no link.