第一个表结构有问题:我理解的应该是id为一个字段,menbers为一个字段(表B的外键)
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、网站空间、营销软件、网站建设、枝江网站维护、网站推广。
id menbers(id和menbers为联合主键)
1 1
1 2
1 3
1 6
1 8
2 2
...
我不理解你表A menber字段s是怎能存储的,不是数组吧?这个我不清楚。
查询的时候直接select A.id B.name from A , B where A.menbers = B.id;就行
如果你希望知道用户表的结构的修改时间,
你可以到系统表中去找,比如:sysobjects,syscolumns
如果你希望或者表中数据的修改时间,那么没有的,只有自己维护一个数据修改列,在程序中维护,或者通过触发器维护。
软件说明
通过etl工具定时将SqlServer指定的表数据同步到oracle数据库
在数据库建立增删改的触发器。触发器将变更放到临时表里。
通过etl工具读取临时表同步给oracle
优点:比较实时
缺点:影响到业务系统,因为需要在业务系统建立触发器
实例说明:
例如在sqlserver有一张用户表(sys_user)需定时同步oracle数据库的用户表,
包括新增、删除、修改同步
给同步的表建三类触发器:
insert触发器:向表中插入数据时被触发;
update触发器:修改表中数据时被触发;
delete触发器:从表中删除数据时被触发。
以sqlserver的用户表举例,
Sqlserver的sys_user表,有两个字段id,name
具体流程:
以新增数据举例
Ø 一、在sqlserver新建触发器trigger_sysuser_insert
if (object_id('trigger_sysuser_insert') is not null)
drop trigger trigger_sysuser_insert
go
create trigger trigger_sysuser_insert
on sys_user --表名
for insert --插入后触发
--instead of insert --插入前触发,使用插入前触发时,不执行默认插入
as
--开始执行逻辑
declare @id int, @name varchar(20);
select @id = id, @name = name from sys_user; -------------- inserted 存放了当前插入的值
--select @name,@age
---创建临时表
if not exists (select * from sysobjects where id = object_id('##sys_user_insert')
and OBJECTPROPERTY(id, 'IsUserTable') = 1)
create table ##sys_user_insert
(
id int,
name varchar(32)
);
insert into ##sys_user_insert (id,name) values(@id,@name);
go
在sys_user新增数据时会被触发,将新增的数据加入临时表##sys_user_insert,此时
的临时表 ##sys_user_insert会增加一条记录
Ø 二、配置elt流程
节点1 从临时表读取数据,写入数据流
节点2 从数据流获取数据写入oracle
节点3 从sqlserver的临时表删除已经被同步的记录
Ø 三、建立作业调度
设置调度周期
适用增量数据同步
在要同步的源表里有时间戳字段,每当数据发生新增,时间戳会记录发生变化的时间,etl工具根据时间范围定时同步数据
优点:基本不影响业务系统
缺点:要求源表必须有时间戳这一列,适用增量场景,修改、删除不太适用
定时清空oracle数据源,将sqlserver的数据全盘拷贝到oracle数据源。一般用于数据量不大,实时性要求不高的场景。
优点:基本不影响业务系统,开发、部署都很简单
缺点:效率低
Etl流程
结论
准能现场数据同步,涉及增、删、改的同步,比较适用触发器的方式进行数据同步,但触发器仍会存在失效的情况,若现场有数据质量系统,定期数据稽核,查缺补漏,保证两边数据库的一致性;