为 UPPER() Firebird 数据创建触发器

Create trigger to UPPER() Firebird data

我有一个在我的 Firebird 中更新或插入数据的查询,但是这个值来自什么用户类型,所以我想创建一个模式,所有数据都是 Upper。

可以在 Firebird 2.5 中实现吗?

我的#1 测试

"UPDATE OR INSERT INTO ENTIDADE_001 (CODCLI,NAME) VALUES UPPER('$erp_codcli','$erp_codcli')"

我的#2 测试

"UPDATE OR INSERT INTO ENTIDADE_001 (CODCLI,NAME) VALUES UPPER(('$erp_codcli','$erp_codcli'))"

您的更新或插入语句的问题在于它们在语法上不正确。 VALUES 子句采用值列表,而 UPPER(...) 不是值列表,请参见 UPDATE OR INSERT 的语法:

UPDATE OR INSERT INTO
   {target} [(<column_list>)]
   VALUES (<value_list>)
   [MATCHING (<column_list>)]
   [RETURNING <values> [INTO <variables>]]

<column_list>      ::=  colname  [, colname  ...]
<value_list>       ::=  value    [, value    ...]
<ret_values>       ::=  ret_value    [, ret_value    ...]
<variables>        ::=  :varname [, :varname ...]

其次,UPPER是一个接受单个参数的函数。

你的语句在语法上正确的版本是:

UPDATE OR INSERT INTO ENTIDADE_001 (CODCLI,NAME) 
  VALUES (UPPER('$erp_codcli'), UPPER('$erp_codcli'))

但是,正如 Arioch 'The 在评论中所说,这样的字符串插值是不安全的,并且会使您的代码容易受到 SQL 注入的攻击。您应该使用参数化准备语句,并将值设置为参数。

关于您的问题标题中提出的如何创建触发器的问题,请参阅 triggers 上的 Firebird 文档。执行您想要的操作的触发器的一个简单示例是:

create trigger ENTIDADE_001_UPPERCASE 
  active before insert or update on ENTIDADE_001
as
begin
  new.CODCLI = upper(new.CODCLI);
  new.NAME = upper(new.NAME);
end

请参阅此 dbfiddle 以获取工作示例。