65.9K
CodeProject 正在变化。 阅读更多。
Home

在 4D 中实现触发器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.37/5 (32投票s)

2007年3月10日

CPOL

2分钟阅读

viewsIcon

26740

downloadIcon

127

本文的目标读者是4D新手开发者。它旨在解释如何在4D数据库中使用触发器。

引言

4D (4th dimension) 是一个跨平台的、关系型数据库管理系统,它有助于构建出色的数据库和Web应用程序。这个开发工具由4D, Inc拥有,自1984年以来一直存在。4th dimension 支持广泛的标准,包括ODBC、原生HTTP服务器、FastCGI、XML和SOAP。

在本文中,我将讨论4D中触发器的概念以及如何在4D应用程序中实现它们。

现在,您一定想知道4D中的触发器是否与SQL触发器有所不同或等同。让我告诉您,定义与我们在SQL世界中找到的非常相似,但是它们的实现方式却大相径庭。

4D中的触发器是与表关联的方法,用于控制和验证影响记录或整个表的操作。

4D触发器的特定功能是它们在数据库引擎运行的机器上执行。它们返回一个错误代码,如果没有问题则返回0。一次只能运行一个触发器。

4D中表属性对话框的触发器选项卡列出了四个不同的事件

  1. 保存新记录时
  2. 保存现有记录时
  3. 删除记录时
  4. 加载记录时

这些被称为数据库事件或记录修改事件。

编写触发器的格式

这是一个触发器的示例

` [Employee] Trigger 
C_LONGINT($0;$ErrorCode) 
$ErrorCode:=0 

Case of: 
(Database event=Save Existing Record Event) 
$ErrorCode:= EmployeeSaveExisting 
: (Database event=Save New Record Event) 
$ErrorCode:= EmployeeSaveNew 
: (Database event=Delete Record Event) 
$ErrorCode:= EmployeeDelete 
: (Database event=Load Record Event) 
Else ` A bug. 
$ErrorCode:=-1 
End case 
$0:=$ErrorCode 

让我借此机会向您解释一下4D中的级联触发器。请看下面的解释

当一个触发器执行调用另一个表触发器的操作时,它被称为触发器级联。触发器级联对于避免系统中出现孤立记录是必要的。

例如,考虑以下情况

假设有三个表,例如 [table1],[table2] 和 [table3]。

当您删除一个 [table1] 记录时,它的触发器会删除所有相关的 [table2] 记录。反过来,[table2] 触发器会删除所有相关的 [table3] 记录。这就是级联触发器的预期行为。

现在假设有第四个表,例如 [table4],它依赖于 [table3] 中的一个字段。[table3] 记录被删除,因此当我们进行更新时,[table4] 将会表现出危险行为。

这个问题在4D中可以很容易地解决。在4D语言中,我们有一个命令(称为触发器级别),它为我们提供了处理这种情况的能力。该命令让我们知道我们所处的位置。第一个触发器执行的是级别1,第二个是级别2,依此类推。

例如,如果您想说只有 [table2] 触发器才能删除 [table3] 记录,那么 [table3] 触发器将包含类似这样的代码

C_LONGINT($0;$errorCode) 
Case of:(Database event=Delete Record Event) 
` Deletion is allowed only from the [table2] trigger. 
I f(Trigger level<2) 
` Return an error code: 
$errorCode:=-1 
Else 
` Get the properties of the invoking trigger (Trigger level - 1). 
TRIGGERPROPERTIES(Triggerlevel-1;$invokingEvent;$invokingTableNum;$recordNum) 
` delete record trigger 
$TableNum:=Table(->[table2]) 
I f($invokingEvent#Delete Record Event) | ($TableNum#$invokingTableNum) 
` return an error. 
$errorCode:=-2 
Else 
` Carry on the deletion. 
$errorCode:=0 
End if 
` ($invokingEvent#Delete Record Event)| ($TableNum #$invokingTableNum) 
End if 
` (Trigger level<2) 
End case 
$0:=$errorCode 

摘要

本文提供了关于在4D中使用触发器的更好的见解。新手用户可以轻松理解并使用触发器来处理不同的数据库事件。

Manjushree Das
www.mindfiresolutions.com

历史

  • 2007年3月10日:最初发布
© . All rights reserved.