免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3895 | 回复: 6
打印 上一主题 下一主题

触发器中执行删除数据表操作是否可以? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-26 11:25 |只看该作者 |倒序浏览
下面这段触发器代码是可以正常导入的

  1. DELIMITER |
  2. CREATE TRIGGER mytest2 BEFORE INSERT ON tblist
  3.     FOR EACH ROW BEGIN
  4.         DECLARE tb_name VARCHAR(128);
  5.         DECLARE tb_count INT DEFAULT 0;
  6.         SELECT COUNT(*) INTO tb_count FROM tblist;
  7.         SELECT name INTO tb_name FROM tblist WHERE count = (SELECT MIN(count) FROM tblist);
  8.     END
  9. |
  10. DELIMITER ;
复制代码

意思是取出tblist中count最小的数据项的name 其中name的值是数据库中已经存在的一个数据库表名。我想删除这张表。结果加上drop table语句后 就不行了



  1. DELIMITER |
  2. CREATE TRIGGER mytest2 BEFORE INSERT ON tblist
  3.     FOR EACH ROW BEGIN
  4.         DECLARE tb_name VARCHAR(128);
  5.         DECLARE tb_count INT DEFAULT 0;
  6.         SELECT COUNT(*) INTO tb_count FROM tblist;
  7.         SELECT name INTO tb_name FROM tblist WHERE count = (SELECT MIN(count) FROM tblist);
  8.         [color=Red]DROP TABLE tb_name;[/color]
  9.     END
  10. |
  11. DELIMITER ;
复制代码

系统提示

  1. ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger.
复制代码

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
2 [报告]
发表于 2009-02-26 12:06 |只看该作者
印象 中不允许在这里使用drop。

把这句改成insert类的试试?

回头我测试下。

论坛徽章:
0
3 [报告]
发表于 2009-02-26 12:17 |只看该作者
原帖由 枫影谁用了 于 2009-2-26 12:06 发表
印象 中不允许在这里使用drop。

把这句改成insert类的试试?

回头我测试下。



恩 其他类的应该是没有问题的。
我之前搜了一些内容,好像是不支持这种直接中断事务的语句吧

难道触发器支持事务?今天临时研究的这个东西。太迷糊了。

我看网上有说用什么EXEC的。  我尝试不行,不知道还有没有别的问题。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
4 [报告]
发表于 2009-02-26 12:25 |只看该作者
触发器 是支持事务的。


·         触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。

·          对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。

[ 本帖最后由 枫影谁用了 于 2009-2-26 12:27 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-02-26 12:56 |只看该作者
原帖由 枫影谁用了 于 2009-2-26 12:25 发表
触发器 是支持事务的。


·         触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。

·          对于事务性表,如果触发程序失败(以及由此导致的整 ...


不知道DROP TABLE算不算是开始或结束事务啊。实在是不熟悉触发器和存储过程。不知道的东西太多了啊!

论坛徽章:
0
6 [报告]
发表于 2009-02-26 15:25 |只看该作者
就没有人知道这个问题?是我问的太简单了。还是怎么着了呢。没办法了,只能先用程序去实现。过后再考虑这个问题了!

论坛徽章:
0
7 [报告]
发表于 2009-02-28 12:00 |只看该作者
触发器不是干这个事情的,MySQL里面的TRIGGER现在只是行级别的。

其他操作在SPROC里面做。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP