SQL 合并复制时自增序列,值跳跃问题

lzf740308 2018-10-04 10:15:28
组态王6.55做SQL2012数据库写入,需要做双机数据库写入切换,再利用复制功能实现主从机数据库同步,由于组态王6.55写入数据库的变量类型没有DATETIME类型,在后续组态王的历史曲线控件中没有办法调用日期时间参数,所以就利用了数据库的触发器功能,当组态王向数据库中写入数据时,运行下面的触发器:

ALTER TRIGGER [dbo].[TRI9]
ON [dbo].[GasMonitor]
FOR INSERT
AS
BEGIN
UPDATE GasMonitor
SET 日期时间 = getdate() where 序号=(select Max(序号) From GasMonitor)
END

利用数据库触发器功能写入日期时间,单机运行时一切正常,但进行主从数据库同步复制时,当从机或主机的数据同步到另外一台电脑的数据库时,自增的序列就会出现值跳跃问题,比如从机数据本地自增序号为1,复制到主机时就会变成20001,但我触发器命令都是以序号最大值为基础的,这就会造成切换回本地数据记录时,新加入的数据序号还是从本地自增序列开始,这个序列号远远要小于从机写入时跳跃的序号值,触发器只对从机写入的序号跳跃很大的值更改它的日期时间序列,本地新增数据的日期时间序列数据就是NULL;

原来咨询过此类问题,有建议主从数据库两个表单序号自增种子采用奇偶数,防止重复,但我发现在同步复制时,两个表单所有的内容都变成一样了,包括表单结构、触发器内容,就是当时设置想让两个表单自增不重复,但同步复制时,连自增序列都变成一样的了,数据同步复制过来后,还是没有解决问题;

请教高手帮忙给个建议解决下这个问题,提供解决思路或办法都可以
...全文
821 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
king4323210 2018-10-19
  • 打赏
  • 举报
回复
同步数据之前打开IDENTITY_ISNERT选项,把主键一起复制过来
Zhang7613022 2018-10-08
  • 打赏
  • 举报
回复
在表的字段設置日期時間字段的默認值爲Getdate() 應該就可以解決你的需求
老夏 2018-10-07
  • 打赏
  • 举报
回复
非要用触发器的话,这个触发器应该对新插入的行进行处理,而不是查询行然后处理,应该这样写:

UPDATE GasMonitor SET 日期时间 = getdate() where 序号=inserted.序号

这里 inserted 是关键字,表示新插入行
xiaoxiangqing 2018-10-07
  • 打赏
  • 举报
回复
用默认值就行了。
卖水果的net 2018-10-04
  • 打赏
  • 举报
回复
UPDATE GasMonitor SET 日期时间 = getdate() where 序号=(select Max(序号) From GasMonitor) 看样子是给最后写入的行,取得当前时间。 建议改成 默认值,而不是使用触发器。

create table test(
id int,
crdate datetime default getdate()
)
吉普赛的歌 2018-10-04
  • 打赏
  • 举报
回复
--如果仅仅是希望在插入时添加默认的当前时间, 用默认约束不就可以了?
USE tempdb
GO
IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
GO
CREATE TABLE test(
id INT IDENTITY(1,1) PRIMARY KEY,
n NVARCHAR(10),
日期时间 DATETIME DEFAULT(GETDATE())
)
GO
INSERT INTO test(n) VALUES ('abc')
GO
SELECT * from test
/*
id n 日期时间
----------- ---------- -----------------------
1 abc 2018-10-04 16:54:21.553
*/

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧