是否可以拥有数据库范围的常量? 我想要的是定义一个常量:
然后在例如触发器中使用它:
CREATE TRIGGER AD_PRJ_PROJECTS FOR PRJ_PROJECT
ACTIVE AFTER DELETE
POSITION 1
AS
BEGIN
EXECUTE PROCEDURE SP_ADD_HISTORY 'PRJ_PROJECT', DELETE_CONSTANT;
END;
答案 0 :(得分:2)
您可以使用生成器:
SET GENERATOR DELETE_CONSTANT TO 3;
...
EXECUTE PROCEDURE SP_ADD_HISTORY 'PRJ_PROJECT', GEN_ID(DELETE_CONSTANT, 0);
更新:是的,为此目的使用生成器是危险的,因为它们可以更改。 但是,在FireBird 3.0 Alpha 1中,使用访问权限可以消除此风险:Grants access on generators。
答案 1 :(得分:2)
我认为没有一种简单的方法来声明常量。
我可以通过为用户定义的函数创建自己的DLL来完成,并为每个常量创建一个函数。
我认为使用生成器作为“全局”常量的想法很有效。
但是你可以制作一个“局部常量”来使你的代码更具可读性:
CREATE TRIGGER AD_PRJ_PROJECTS FOR PRJ_PROJECT
ACTIVE AFTER DELETE
POSITION 1
AS
DECLARE VARIABLE DELETE_CONSTANT INTEGER;
BEGIN
DELETE_CONSTANT = 1;
EXECUTE PROCEDURE SP_ADD_HISTORY 'PRJ_PROJECT', DELETE_CONSTANT;
END;
答案 2 :(得分:0)
您可以实现一些脚本的简单预处理器,将常量转换为值。
triggers.presql
@DELETE_CONSTANT = 1
CREATE TRIGGER AD_PRJ_PROJECTS FOR PRJ_PROJECT
ACTIVE AFTER DELETE
POSITION 1
BEGIN
EXECUTE PROCEDURE SP_ADD_HISTORY 'PRJ_PROJECT', DELETE_CONSTANT;
END;
triggers.sql
CREATE TRIGGER AD_PRJ_PROJECTS FOR PRJ_PROJECT
ACTIVE AFTER DELETE
POSITION 1
BEGIN
EXECUTE PROCEDURE SP_ADD_HISTORY 'PRJ_PROJECT', 1;
END;
答案 3 :(得分:0)
使用带有触发器的单行表,以防止从中插入和删除。必须阅读它肯定不会使代码更清晰,但它有助于实现这样的"常量"。同时删除除sysdba之外的所有人的写权限