Estou tentando eliminar uma tabela em um banco de dados que é um editor. A tabela em questão não está sendo publicada. O erro que recebo é:
Msg 15021, Level 16, State 1, Procedure sp_MStran_ddlrepl, Line 14 [Batch Start Line 1]
Invalid value given for parameter @procmapid. Specify a valid parameter value.
Msg 3609, Level 16, State 2, Line 2
The transaction ended in the trigger. The batch has been aborted.
Verifiquei sysarticles
se há um registro antigo ou órfão, mas a tabela não aparece. Alguma idéia sobre qual é o problema aqui?
Editar: SQL Server 2016 RTM
TL;DR: esse erro pode ocorrer se você restaurar (ou mover) um banco de dados que foi replicado anteriormente para um servidor de versão e/ou nível de patch inferior e, em seguida, reativar a replicação. Veja abaixo as soluções e uma explicação mais longa.
A replicação usa gatilhos de banco de dados para certas coisas
Quando um banco de dados é publicado para replicação transacional no SQL Server, como parte do processo de configuração, vários gatilhos no nível do banco de dados são criados. Normalmente, são:
Você pode encontrá-los expandindo seu banco de dados no explorador de objetos, procurando em "Programmability" e depois em "Database Triggers". Eles fazem praticamente o que dizem. Se você examinar o código,
tr_MStran_altertable
verá que cada vez que esse gatilho é acionado para uma instrução ALTER TABLE, o SQL Server usa a função EventData() para capturar o que está sendo alterado e, em seguida, chama outro procedimento armazenado de replicação que realmente capturará o atividade e enviar a transação DDL relacionada ao banco de dados de distribuição. Isso é diferente do agente do leitor de log que procura e captura alterações de dados.Esses gatilhos são criados sempre que você publica um banco de dados para replicação e também são removidos como parte da remoção da replicação.
Novo suporte DROP TABLE no SQL Server 2014 SP2 e SQL Server 2016 SP1
No SQL Server 2014 SP2 e SQL Server 2016 SP1, a Microsoft introduziu uma alteração para a replicação do SQL Server: Suporte para DROP TABLE ( https://support.microsoft.com/en-us/help/3170123 ). Antes, você não podia descartar uma tabela marcada para replicação. Esse novo recurso, que não está habilitado por padrão, significa que a instrução DROP TABLE não gerará mais um erro. Para facilitar essa mudança, um novo trigger de nível de banco de dados foi adicionado:
tr_MStran_droptable
. Este é o acionador que é acionado para cada ação de descarte de tabela e usa os dados do evento para determinar qual tabela estava sendo eliminada e se a opção de dar suporte à transação, mesmo que a tabela esteja marcada para replicação, está habilitada.Mas e as versões "antigas" do SQL Server?
E é aí que entra o problema: esse gatilho só é criado pela replicação nas versões que o suportam... e removido apenas pela replicação nas versões que o suportam. Portanto, mesmo que você decida eliminar a replicação com algo como
sp_removedbreplication
esse gatilho, não será descartado e continuará a disparar toda vez que tentar descartar uma tabela, mesmo que a tabela que você está tentando descartar não esteja marcada para replicação . Isso pode acontecer se:Você mesmo pode testar isso: se você desabilitar a replicação e reativá-la, notará que os tempos de criação nos gatilhos do banco de dados coincidirão com quando você reativou a publicação, mas o
tr_MStran_droptable
gatilho permanece.Corrigindo o problema
Para resolver esse problema, você pode: