Create table A(A Varchar(50) )
Insert TEST Select * from SysColumns Where ID=OBJECT_ID('B') And ColID<>1 Order By ColID
Insert TEST Select * from SysColumns Where ID=OBJECT_ID('B') And ColID<>1 Order By ColID
则表b中的字段为11,22,33,44,55
我实际应用中表a的字段a的值的类型是varchar,
当表a中字段a中插入一个99的值,则表b中也增加相应的99字段。
假定b表中的变化列的数据类型都是varchar(6), 我试试看.
你要做的是不是这件事.
A.Table
-------------------------
id col1 col2 col3
1 a b c
2 c d e
3 r g f B.Table
-------------------------
col1 col2 col3
a b c
c d e
r g f
---------------------------------
我知道是不是这么回事,A.Table 发生变化时B.Table也做同步,是不是???
A.Table
-------------------------
id col1
1 aa
2 bb
3 cc B.Table
-------------------------
aa bb cc
---------------------------------
同时,如果知道a列中的字符串的最大长度,且a列中不含一些特殊字符(如', ", %, _等)的话,那就容易一些了。 对于上面的要求,我大致实现了一个trigger。如果楼主要需求肯定下来的话,我就可以把代码贴上来了。
if exists(select* from sysobjects where name='ta' and xtype='U')
drop table ta
create table ta ( bcolumn varchar(20) unique not null, aint int)
go
--创建表tb
if exists(select* from sysobjects where name='tb' and xtype='U')
drop table tb
go
create table tb( bint int)
go
--创建trigger
if exists(select* from sysobjects where name='fluctuate' and xtype='TR')
drop trigger fluctuate
go
create trigger fluctuate
on ta
after update, insert, delete
as
declare @table varchar(10)
declare @str varchar(100)
declare @c1 varchar(20)
declare @c2 varchar(20)
set @table='tb' --(该处适当修改)
select @c2=bcolumn from deleted --修改或删除的列 (该处适当修改)
select @c1=bcolumn from inserted --新增或修改的列 (该处适当修改)
if @c1 is not null set @c1='['+@c1+']'
if @c2 is not null set @c2='['+@c2+']'
if @c2 is not null and @c1 is not null --当前进行update操作
set @str='sp_rename '+char(0x27)+@table+'.'+
@c2+char(0x27)+', '+@c1if @c2 is null and @c1 is not null --当前进行insert操作
set @str='alter table '+@table+' add '+@c1+' varchar(6)'if @c2 is not null and @c1 is null --当前进行delete操作
set @str='alter table '+@table+' drop column '+@c2print '@str:'+@str
begin tran
exec(@str)
if @@error=0 commit tran
else rollback tran
go
--测试数据
insert into ta select '11', 1
--查看效果
select* from ta
select* from tb--测试数据
insert into ta select '22', 4
--查看效果
select* from ta
select* from tb--测试数据
update ta set bcolumn='44' where bcolumn='11'
--查看效果
select* from ta
select* from tb--测试数据
delete ta where bcolumn='22'
--查看效果
select* from ta
select* from tb
我实现的触发器不是元组级触发器.(sqlserver本身是不支持元组级触发器的。 要实现的话,应该用到游标, 表变量。我嫌它太麻烦就没有搞,如果楼主想要的话,也可以去实现它)
不是元组级触发器的含义就是:如果insert、update或delete多条元组时,只会对最后一条元组进行触发操作。
sorry.