Sumário


Recentemente, trabalhei em um cliente que por política interna não pode ter Ocorrências removidas do CRM. A forma que esse cliente controla isso é através dos ticket numbers das Ocorrências.
Eles notaram que alguns ticket numbers (Case Number) estavam faltando no sistema e me questionaram se alguém poderia deletar Ocorrências exceto os Administradores de Sistema.
Revisamos as Security Roles, notamos que somente Administradores do Sistema poderiam deletar e que a Auditoria também não apontava nenhuma exclusão. O próximo passo seria auditoria no SQL Server, porém, imaginei que fosse algo relacionado a plugin.

Diagnóstico

Ticket numbers são criados seguindo um processo de numeração contínuo conforme exemplo abaixo (Case Number):

image

Notamos que as Ocorrências de CAS-01027 a CAS-01032 foram criadas com êxito. Criamos uma nova Ocorrência e como esperado o próximo número sera 01033.

 

image

Podemos notar a inserção no Banco de Dados via Profiler:

exec sp_executesql N'insert into [IncidentBase]([TicketNumber], [OwningBusinessUnit], [ModifiedOnBehalfBy], [StateCode], [StatusCode], [OwnerIdType], [CreatedBy], [OwnerId], [IncidentStageCode], [PriorityCode], [CreatedOn], [CustomerId], [Title], [IsDecrementing], [SeverityCode], [ModifiedBy], [ExchangeRate], [CustomerIdType], [ModifiedOn], [IncidentId], [TransactionCurrencyId]) values (@TicketNumber0, @OwningBusinessUnit0, NULL, @StateCode0, @StatusCode0, @OwnerIdType0, @CreatedBy0, @OwnerId0, @IncidentStageCode0, @PriorityCode0, @CreatedOn0, @CustomerId0, @Title0, @IsDecrementing0, @SeverityCode0, @ModifiedBy0, @ExchangeRate0, @CustomerIdType0, @ModifiedOn0, @IncidentId0, @TransactionCurrencyId0)',N'@TicketNumber0 ntext,@OwningBusinessUnit0 uniqueidentifier,@StateCode0 int,@StatusCode0 int,@OwnerIdType0 int,@CreatedBy0 uniqueidentifier,@OwnerId0 uniqueidentifier,@IncidentStageCode0 int,@PriorityCode0 int,@CreatedOn0 datetime,@CustomerId0 uniqueidentifier,@Title0 ntext,@IsDecrementing0 bit,@SeverityCode0 int,@ModifiedBy0 uniqueidentifier,@ExchangeRate0 decimal(11,10),@CustomerIdType0 int,@ModifiedOn0 datetime,@IncidentId0 uniqueidentifier,@TransactionCurrencyId0 uniqueidentifier',@TicketNumber0=N'CAS-01033-T3V8N2',@OwningBusinessUnit0='91C7416A-F38F-E211-9A81-00155D0D150B',@StateCode0=0,@StatusCode0=1,@OwnerIdType0=8,@CreatedBy0='74DB416A-F38F-E211-9A81-00155D0D150B',@OwnerId0='74DB416A-F38F-E211-9A81-00155D0D150B',@IncidentStageCode0=1,@PriorityCode0=2,@CreatedOn0='2013-03-19 13:17:28',@CustomerId0='F69515FC-FE8F-E211-8B0F-00155D0D150B',@Title0=N'New Testing',@IsDecrementing0=0,@SeverityCode0=1,@ModifiedBy0='74DB416A-F38F-E211-9A81-00155D0D150B',@ExchangeRate0=1.0000000000,@CustomerIdType0=1,@ModifiedOn0='2013-03-19 13:17:28',@IncidentId0='B6408A58-9790-E211-8B0F-00155D0D150B',@TransactionCurrencyId0='5EF96497-F38F-E211-9A81-00155D0D150B'

Escrevi um simples plugin em C# para bloquear a criação de uma Ocorrência se determinado critério não fosse atendido e registramos para a entidade incident, Create message e Post-operation:

image

Importante notar que ambos estágios ocorrem em Database Transaction. Realizamos a tentativa de criação de Ocorrência porém o plugin fez uma determinada validação e falhou com o processo conforme abaixo:

image

Ainda monitorando o SQL Server, podemos notar que o registro CAS-01034-C7Y0G6 foi criado, entretanto, realizado rollback, isto é, descartando o registro.

exec sp_executesql N'insert into [IncidentBase]([TicketNumber], [OwningBusinessUnit], [SeverityCode], [ModifiedOnBehalfBy], [StateCode], [StatusCode], [OwnerIdType], [CreatedBy], [OwnerId], [IncidentStageCode], [PriorityCode], [CreatedOn], [CustomerId], [Title], [IsDecrementing], [KbArticleId], [ModifiedBy], [ExchangeRate], [CustomerIdType], [ModifiedOn], [IncidentId], [TransactionCurrencyId]) values (@TicketNumber0, @OwningBusinessUnit0, @SeverityCode0, NULL, @StateCode0, @StatusCode0, @OwnerIdType0, @CreatedBy0, @OwnerId0, @IncidentStageCode0, @PriorityCode0, @CreatedOn0, @CustomerId0, @Title0, @IsDecrementing0, @KbArticleId0, @ModifiedBy0, @ExchangeRate0, @CustomerIdType0, @ModifiedOn0, @IncidentId0, @TransactionCurrencyId0)',N'@TicketNumber0 ntext,@OwningBusinessUnit0 uniqueidentifier,@SeverityCode0 int,@StateCode0 int,@StatusCode0 int,@OwnerIdType0 int,@CreatedBy0 uniqueidentifier,@OwnerId0 uniqueidentifier,@IncidentStageCode0 int,@PriorityCode0 int,@CreatedOn0 datetime,@CustomerId0 uniqueidentifier,@Title0 ntext,@IsDecrementing0 bit,@KbArticleId0 uniqueidentifier,@ModifiedBy0 uniqueidentifier,@ExchangeRate0 decimal(11,10),@CustomerIdType0 int,@ModifiedOn0 datetime,@IncidentId0 uniqueidentifier,@TransactionCurrencyId0 uniqueidentifier',@TicketNumber0=N'CAS-01034-C7T0G6',@OwningBusinessUnit0='91C7416A-F38F-E211-9A81-00155D0D150B',@SeverityCode0=1,@StateCode0=0,@StatusCode0=1,@OwnerIdType0=8,@CreatedBy0='74DB416A-F38F-E211-9A81-00155D0D150B',@OwnerId0='74DB416A-F38F-E211-9A81-00155D0D150B',@IncidentStageCode0=1,@PriorityCode0=2,@CreatedOn0='2013-03-19 13:36:18',@CustomerId0='F69515FC-FE8F-E211-8B0F-00155D0D150B',@Title0=N'Failed Testing',@IsDecrementing0=0,@KbArticleId0='09B54048-FA8F-E211-8B0F-00155D0D150B',@ModifiedBy0='74DB416A-F38F-E211-9A81-00155D0D150B',@ExchangeRate0=1.0000000000,@CustomerIdType0=1,@ModifiedOn0='2013-03-19 13:36:18',@IncidentId0='D64730FA-9990-E211-8B0F-00155D0D150B',@TransactionCurrencyId0='5EF96497-F38F-E211-9A81-00155D0D150B'

 

Se criarmos uma nova Ocorrência com êxito, o número descartado acima não será utilizado (não existe a Ocorrência CAS-01034):

image

 

Conclusão

Notamos que as Ocorrências seguem um padrão de numeração e no caso desse cliente, podemos ter “ticket faltantes” no cenário de falha de plugin.

Links

Event Execution Pipeline
http://msdn.microsoft.com/en-us/library/gg327941.aspx