在 4D 中实现触发器






3.37/5 (32投票s)
本文的目标读者是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中表属性对话框的触发器选项卡列出了四个不同的事件
- 保存新记录时
- 保存现有记录时
- 删除记录时
- 加载记录时
这些被称为数据库事件或记录修改事件。
编写触发器的格式
这是一个触发器的示例
` [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日:最初发布