AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 167770
Accepted
Mike Fal
Mike Fal
Asked: 2017-03-22 08:15:27 +0800 CST2017-03-22 08:15:27 +0800 CST 2017-03-22 08:15:27 +0800 CST

由于复制错误,无法删除表,尽管表未发布

  • 772

我试图在作为发布者的数据库中删除一个表。有问题的表格没有发布。我得到的错误是:

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.

我检查sysarticles了是否有旧记录或孤立记录,但表格没有出现。关于这里的问题有什么想法吗?

编辑:SQL Server 2016 RTM

sql-server replication
  • 1 1 个回答
  • 3585 Views

1 个回答

  • Voted
  1. Best Answer
    DATEFROMFARTS
    2017-03-23T15:07:27+08:002017-03-23T15:07:27+08:00

    TL;DR:如果您恢复(或移动)以前复制到较低版本和/或补丁级别的服务器的数据库,然后重新启用复制,则可能会发生此错误。有关解决方案和更长的解释,请参见下文。

    复制对某些事情使用数据库触发器

    在 SQL Server 中为事务复制发布数据库时,作为设置过程的一部分,会创建几个数据库级触发器。通常,它们是:

    tr_MStran_alterschemaonly
    tr_MStran_altertable
    tr_MStran_altertrigger
    tr_MStran_alterview
    

    您可以通过在对象资源管理器中扩展数据库,然后查看“可编程性”和“数据库触发器”来找到它们。他们几乎按照他们所说的去做。如果您查看其中的代码,tr_MStran_altertable您会看到每次触发 ALTER TABLE 语句的触发器时,SQL Server 使用 EventData() 函数来捕获正在更改的内容,然后调用另一个复制存储过程,该过程将实际捕获活动并将相关的 DDL 事务发送到分发数据库。这与查找和捕获数据更改的日志读取器代理不同。

    每次发布数据库进行复制时都会创建这些触发器,并且也会在删除复制过程中删除这些触发器。

    SQL Server 2014 SP2 和 SQL Server 2016 SP1 中的新 DROP TABLE 支持

    在 SQL Server 2014 SP2 和 SQL Server 2016 SP1 中,Microsoft 引入了对 SQL Server 复制的更改:支持 DROP TABLE ( https://support.microsoft.com/en-us/help/3170123 )。以前,您不能删除标记为要复制的表。这个默认不启用的新特性意味着 DROP TABLE 语句将不再抛出错误。为了促进这一变化,添加了一个新的数据库级触发器:tr_MStran_droptable. 这是为每个删除表操作触发的触发器,它使用事件数据来确定正在删除哪个表,以及是否启用了即使表标记为复制也支持事务的选项。

    但是“旧”版本的 SQL Server 呢?

    这就是问题所在:这个触发器只能通过在支持它的版本上复制来创建......并且只能通过在支持它的版本上复制来删除。因此,即使您决定使用类似sp_removedbreplication此触发器的内容进行核对复制,也不会删除,并且每次尝试删除表时都会继续触发,即使您尝试删除的表未标记为复制。在以下情况下可能会发生这种情况:

    1. 您在支持此功能的版本(2016 SP1 或 2014 SP2)上发布了用于复制的数据库
    2. 您将此数据库备份并还原到不支持此功能的 SQL Server 版本(如 2016 RTM 或 2014 SP1)
    3. 您发布恢复的数据库以进行复制。

    您可以自己进行测试:如果您禁用复制并重新启用它,您会注意到数据库触发器的创建时间将与您重新启用发布的时间一致,但tr_MStran_droptable触发器仍然存在。

    解决问题

    要解决此问题,您可以:

    1. 将受影响的实例升级到支持此触发器的补丁级别(2014 SP2 或 2016 SP1)。
    2. 手动删除触发器,因为它不受支持。
    • 7

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve