查看: 516|回复: 6

触发器 问题,保证一条数据不被修改

[复制链接]
论坛徽章:
0
发表于 2020-5-19 15:59 | 显示全部楼层 |阅读模式
本帖最后由 westscott 于 2020-5-20 15:23 编辑

想写个触发器,当打开触发器时,保证一个参数的参数值不被修改;
参数表如下:
create table
tsys_xtcs (csdm varchar2(30),csz varchar2(30));

INSERT into tsys_xtcs values('cs1','1,2,3,4');
INSERT into tsys_xtcs values('cs2','2');

想实现效果是,触发器在csdm='cs1'的csz被修改且里面的值不含'%,4%'时触发,更新csz=new.csz||',4',其他csdm不做修改。
例如:update tsys_xtcs set csz='1,2,3,5,6' where csdm='cs1';
                   会被更新为'cs1','1,2,3,5,6'
                          'cs2','2'
然后触发触发器 更新 update tsys_xtcs set csz=csz||',4'  where csdm='cs1' and csz not like '%,04%' ;                 
       之后的值则为'cs1','1,2,3,5,6,4'
                          'cs2','2'

增加触发器以下,但会报错:
CREATE OR REPLACE TRIGGER AFTER_UPD_XTCS
  AFTER UPDATE OF csz ON tsys_xtcs
  FOR EACH ROW
  WHEN (NEW.csdm='cs1'and NEW.csz not like '%,04%' )
BEGIN
  :NEW.CSZ :=:NEW.CSZ||',4';
END;






论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-5-20 09:03 | 显示全部楼层
你的列名是CSZ,为什么代码里面写VC_CSZ ?
看不懂所谓的“不被修改”是什么意思。你的代码明明就对它进行了修改。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2020-5-20 15:16 | 显示全部楼层
本帖最后由 westscott 于 2020-5-20 15:22 编辑
newkid 发表于 2020-5-20 09:03
你的列名是CSZ,为什么代码里面写VC_CSZ ?看不懂所谓的“不被修改”是什么意思。你的代码明明就对它进行了 ...

都是csz,主要是想参数能做到被更新后如果其中删去了',4',就拼接给拼接回去
例如:update tsys_xtcs set csz='1,2,3,5,6' where csdm='cs1';
                    会被更新为'cs1','1,2,3,5,6'
                          'cs2','2'
然后触发触发器 更新 update tsys_xtcs set csz=csz||',4'  where csdm='cs1' and csz not like '%,04%' ;         

       之后的值则为'cs1','1,2,3,5,6,4'
                          'cs2','2'



使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-28 06:00:13
发表于 2020-5-20 15:20 | 显示全部楼层
很难,这是对自身变异表进行修改。网上搜索的办法,我尝试过很多次,没成功,期待楼主补充完整需求。
二楼版主大神给出解决方案, 了了我这小白多年心愿。

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-5-20 21:22 | 显示全部楼层
你应该用BEFORE而不是AFTER触发器。另外你的 04 应该改成 4:

CREATE OR REPLACE TRIGGER AFTER_UPD_XTCS
  before UPDATE OF csz ON tsys_xtcs
  FOR EACH ROW
  WHEN (NEW.csdm='cs1'and NEW.csz not like '%,4%' )
BEGIN
  :NEW.CSZ :=:NEW.CSZ||',4';
END;
/

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2020-5-21 09:17 | 显示全部楼层
newkid 发表于 2020-5-20 21:22
你应该用BEFORE而不是AFTER触发器。另外你的 04 应该改成 4:CREATE OR REPLACE TRIGGER AFTER_UPD_XTCS  b ...

可以了,多谢版主!
就是这里为什么要用before有点不明白

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-5-21 21:32 | 显示全部楼层
westscott 发表于 2020-5-21 09:17
可以了,多谢版主!就是这里为什么要用before有点不明白

既然是AFTER UPDATE了,那就是生米煮成熟饭,当然不能够再修改数据了。
我不推荐这种把逻辑放在触发器中的“黑箱魔术”。这会把程序员坑惨了,明明写进去的是一种数据,读出来又是另外一种,会浪费很多时间在DEBUG。这个逻辑应该放在应用程序(存储过程或其他语言的程序)来实现,表上面应该只定义一个检查约束CHECK CONSTRAINT, 确保写入的数据含有你要的东西,否则就报错,而不是不声不响就把数据改掉。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年9月21日~23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表