创建仅在创建新表时运行的触发器

Posted

技术标签:

【中文标题】创建仅在创建新表时运行的触发器【英文标题】:Creating a trigger to only run when a new table is being created 【发布时间】:2011-06-16 07:01:49 【问题描述】:

我知道我可以用它来创建 DDL 创建触发器;

CREATE OR REPLACE TRIGGER 
  create_table_trigger
  AFTER CREATE ON SCHEMA
DECLARE
BEGIN
END;

问题是这个触发器会在像“创建序列”这样的 DDL 上运行;我怎样才能只为“创建表”DDL 执行此操作?

【问题讨论】:

创建表听起来像是一个非常值得怀疑的数据库设计。 @OMG 可能,但在某些时候创建表格肯定是一个好的设计。 @OMG,我曾开发过一个为零售店生成订单的应用程序。订单数据通常为 500,000 行,每天生成数百个订单。对于每个订单,都会创建一个新表并存储数据。 【参考方案1】:
CREATE OR REPLACE TRIGGER 
  create_table_trigger
  AFTER CREATE ON SCHEMA
BEGIN
  IF SYS.DICTIONARY_OBJ_TYPE = 'TABLE' THEN
      ....
END;

有关 EVENT 属性的列表,请参阅此页面http://ist.marshall.edu/ist480adbp/plsql_triggers.html(链接已关闭)

Wayback机器链接到上面死链接的内容: https://web.archive.org/web/20110809071133/http://ist.marshall.edu/ist480adbp/plsql_triggers.html

据我所知,dictionary_obj_type 是其中之一 表|序列|过程|索引|功能|类型|包

而dictionary_obj_name就是表/序列/proc/etc的名字。

dictionary_obj_type 返回发生触发触发器的 DDL 操作所在的字典对象的类型。 dictionary_obj_name 返回发生触发触发器的 DDL 操作所在的字典对象的名称。

【讨论】:

哦,还有,我怎样才能得到正在创建的表的名称? 我收到以下错误..(1064,“您的 SQL 语法有错误;请查看与您的 mysql 服务器版本相对应的手册,以了解在 'TRIGGER create_table_trigger AFTER ALTER 附近使用的正确语法ON SCHEMA BEGIN IF DICTIONARY_OBJ_T' 在第 1 行") @VeereshP 这是一个 oracle 解决方案,而不是 MySQL。

以上是关于创建仅在创建新表时运行的触发器的主要内容,如果未能解决你的问题,请参考以下文章

创建 SQL 触发器以更新另一个表时出错

sqlserver创建一个新表,求助

尝试创建新表时对象名称无效

创建新表时如何添加外键?

mysql之ptschema-change

在创建新表时插入另一个表中的值