create触发器到upper()firebird数据

k5hmc34c  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(406)

我有一个查询来更新或在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'))"
j2datikz

j2datikz1#

update或insert语句的问题是它们在语法上不正确。这个 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在评论中所说的那样,像这样的字符串插值是不安全的,并且使您的代码容易受到sql注入的攻击。您应该使用参数化的prepared语句,并将值设置为参数。
关于如何创建触发器的问题,请参阅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以获取一个工作示例。

相关问题