2014-10-27 34 views
0

我想创建插入新行的SQL触发器,当且仅当它通过给定条件时。我可以想到一些方法来做到这一点,但我不确定哪种方法是最好的或正确的。使用触发器有条件地插入的最佳方式

  1. 执行AFTER INSERT触发器,然后在条件失败时删除新行。
  2. 做一个BEFORE INSERT触发器,如果​​失败则引发应用程序错误。
  3. ???
+0

在执行插入操作之前,是否可以更好地使用存储过程来检查传入数据? – OneHoopyFrood 2014-10-27 19:49:24

+0

我不认为这种情况会有什么不同。 – 2014-10-27 19:53:11

回答

1

选项1创建竞争条件。我会明确避免这一点。

选项2可能会导致显着较慢INSERT s,但可以工作。

选项3是一个存储过程,但您可能需要为插入的每一行调用proc,除非正确设置安全性,否则实际上可能不会阻止用户直接插入数据。

选项4是将所有内容插入登台表或事务表中,然后使用具有查询或视图的代理或过程将有效数据移动到活动表。这是一个非常古老的学校,因为你不再像现代的RDBMS那样使用RDBMS,所以它是相当讨厌的。预计关键违规问题和同步存在很多问题。而且您也有与选项3相同的安全问题。此方法通常仅用于批量导入和导出。

选项5是验证应用程序中的数据而不是数据库。这会起作用,但当客户尝试像RDBMS一样使用RDBMS时会遇到问题。然后,您遇到与选项3相同的安全问题。它不会实际解决问题或防止应用程序之外的程序存储无效数据。

选项6将使用支持CHECK约束的RDBMS,该约束几乎不包括MySQL或MariaDB的所有内容。 MS SQL Server,Oracle,DB2,PostgreSQL,甚至MS Access和SQLite都支持CHECK约束。 MySQL没有那么适度地荒谬。