火鸟恒定值

时间:2009-12-05 23:09:19

标签: firebird

是否可以拥有数据库范围的常量? 我想要的是定义一个常量:

  • UPDATE_CONSTANT = 1
  • INSERT_CONSTANT = 2
  • DELETE_CONSTANT = 3

然后在例如触发器中使用它:

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;

4 个答案:

答案 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之外的所有人的写权限