日期:2014-05-18  浏览次数:20484 次

如何在删除、更新数据表时自动备份? --高手请进!!!
一些先进的erp系统,都有一种功能,你可以选定一个数据表,选定其中的某几个字段,就可以自动为这个表建立备份。   当这个表的一条数据被删除时,或者当这个表中被设定的几个字段被update时,这条记录就会被备份,记录到另一个表中。

我理解这种功能应该是这样实现的:
首先,我们给出   表名,和这个表中包括的几个重要字段名。然后用存储过程实现以下功能。    
1。根据给出的表名,创建新的表   比如   表名=   给出表明_bak   字段为给出的字段
2。创建触发器,for   delete   update   ,当update   时,判断指定的几个字段是否被update,如果有,插入所更新的记录到新的表。删除时也插入删除的记录到新的表

3。此存储过程要可以更新,因为我们指定的字段会增加或减少。那么相应的应该有存储过程更新这个触发器,也应该有存储过程更新备份表。

我的意思大家应该清楚了,就是在给定表名和字段名的情况下,能方便的给这个表增加自动备份功能。也能方便的编辑。

------解决方案--------------------
动态sql语句基本语法
1 :普通SQL语句可以用Exec执行

eg: Select * from tableName
Exec( 'select * from tableName ')
Exec sp_executesql N 'select * from tableName ' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:
declare @fname varchar(20)
set @fname = 'FiledName '
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec( 'select ' + @fname + ' from tableName ') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName ' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName '
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错


declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName '
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls= 'select count(*) from tableName '
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls= 'select @a=count(*) from tableName '
exec sp_executesql @sqls,N '@a int output ',@num output
select @num

------解决方案--------------------
可以建立一个通用的模板脚本,创建新触发器的时候以这个模板为蓝本,增删修改。

不是说不能写一个通杀的存储过程,写是绝对可以写,输入几个参数,就自动创建触发器。但是,针对某个具体的表写一个触发器,都有可能意想不到的结果,这样的存储过程,写出来也用得不踏实。
------解决方案--------------------
是要在前台做,在前台列出表,选中表后列出字段,

然后选择要备份的字段,然后点确定,

自动调用存储过程,传入参数(表名,字段名),

创建备份表,创建触发器

应该可以自动的

所以要用到动态SQL.
------解决方案--------------------
這是用存儲過程完成的,在前台偉入參數,調用存儲過程
------解决方案--------------------
LZ 的问题建议在前台解决比较好一点,在前台update和delete 的时候判断是否需要保存这条记录还是很好判断的

然后将这条语句的表名和主键字段的值传到存储过程中去,存储过程中根据传入的表名去系统表找出对应的主键字段信息,拼出Sql语句,然后将值插入备份表

以上存储过程做完以后再实际去update和delete 数据