用 C 写触发器、存储过程、视图.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用 C 写触发器 本章描述触发器函数的低层细节。只有当你用 C 书写触发器函数的时候才需要这些信息。 如果你用某种高级语言写触发器,那么系统就会为你处理这些细节。 在大多数情况下,你在书写自己的 C 触发器之前应该考虑使用过程语言。 每种过程语言的文档里面有关于如何用该语言书写触发器的解释。 触发器函数必须使用版本 1(version 1)的函数管理器接口。 当一个函数被触发器管理器调用时,它不会收到任何普通参数,而是收到一个指向TriggerData结构的环境指针。 C 函数可以通过执行实际上被扩展为 ((fcinfo)-context != NULL IsA((fcinfo)-context, TriggerData)) 的宏 CALLED_AS_TRIGGER(fcinfo) CALLED_AS_TRIGGER(fcinfo), 来判断自己是否从触发器管理器中调用的。 如果此宏返回真(TRUE),则可以安全地把fcinfo-context转换成类型 TriggerData * 然后使用这个指向 TriggerData 的结构。 函数本身绝不能更改 TriggerData 结构或者它指向的任何数据。 struct TriggerData 是在 commands/trigger.h 里面定义的: typedef struct TriggerData { NodeTag type; TriggerEvent tg_event; Relation tg_relation; HeapTuple tg_trigtuple; HeapTuple tg_newtuple; Trigger *tg_trigger; Buffer tg_trigtuplebuf; Buffer tg_newtuplebuf; } TriggerData; 这些成员的定义如下: type 总是 T_TriggerData。 tg_event 描述调用函数的事件。你可以用下面的宏检查 tg_event: TRIGGER_FIRED_BEFORE(tg_event) 如果触发器是在操作前触发,返回真。 TRIGGER_FIRED_AFTER(tg_event) 如果触发器是在操作后触发,返回真。 TRIGGER_FIRED_FOR_ROW(tg_event) 如果触发器是行级别事件触发,返回真。 TRIGGER_FIRED_FOR_STATEMENT(tg_event) 如果触发器是语句级别事件触发,返回真。 TRIGGER_FIRED_BY_INSERT(tg_event) 如果触发器是由INSERT触发,返回真。 TRIGGER_FIRED_BY_UPDATE(tg_event) 如果触发器是由UPDATE触发,返回真。 TRIGGER_FIRED_BY_DELETE(tg_event) 如果触发器是由DELETE触发,返回真。 tg_relation 是一个指向描述被触发的关系的结构的指针。 请参考utils/rel.h获取关于此结构的详细信息。 最让人感兴趣的事情是 tg_relation-rd_att(关系行的描述) 和tg_relation-rd_rel-relname(关系名。这个变量的类型不是 char*,而是NameData。 如果你需要一份名字的拷贝,用 SPI_getrelname(tg_relation)获取char* )。 tg_trigtuple 是一个指向触发触发器的行的指针。这是一个正在被插入(INSERT), 删除(DELETE)或更新(UPDATE)的行。如果是 INSERT或DELETE, 那么这就是你将返回给执行者的东西 - 如果你不想用另一条行覆盖此行(INSERT)或忽略操作(在DELETE的时候)。 tg_newtuple 如果是UPDATE,这是一个指向新版本的行的指针,如果是INSERT 或DELETE, 就是NULL。 这就是你将返回给执行者的东西 - 如果事件是 UPDATE 并且你不想用另一条行替换这条行或忽略操作。 tg_trigger 是一个指向结构Trigger的指针,该结构在utils/rel.h里定义: typedef struct Trigger { Oid tgoid; char *tgname; Oid tgfoid; int16 tgtype; bool tgenabled; bool tgisconstra

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档