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

Sql 为UPPER()Firebird数据创建触发器,sql,firebird,firebird2.5,Sql,Firebird,Firebird2.5,我有一个查询来更新或插入Firebird中的数据,但是这个值来自于什么用户类型,所以我想创建一个模式,所有数据都是大写的 有可能在Firebird 2.5中实现吗 我的第一次考试 "UPDATE OR INSERT INTO ENTIDADE_001 (CODCLI,NAME) VALUES UPPER('$erp_codcli','$erp_codcli')" 我的2级考试 "UPDATE OR INSERT INTO ENTIDADE_001 (CODCLI,NAME) VALUES UP

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

有可能在Firebird 2.5中实现吗

我的第一次考试

"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'))"

update或insert语句的问题在于它们在语法上不正确。VALUES子句接受一个值列表,上面的。。。不是值列表,请参见以下语法:

更新或插入到 {target}[] 价值观 [匹配] [返回[进入]] ::=colname[,colname…] :=值[,值…] :=ret_值[,ret_值…] :=:varname[,:varname…] 其次,是一个接受单个参数的函数

您的语句的语法正确版本为:

更新或插入ENTIDADE_001 CODCLI,名称 值上限“$erp\U codcli”,上限“$erp\U codcli” 然而,正如Arioch在评论中所说,像这样的字符串插值是不安全的,并且使您的代码容易受到SQL注入的攻击。您应该使用参数化的prepared语句,并改为将值设置为参数

关于如何创建触发器的问题标题中提出的问题,请参阅上的Firebird文档。执行所需操作的触发器的简单示例如下:

创建触发器ENTIDADE_001_大写 在ENTIDADE_001上插入或更新之前处于活动状态 像 开始 new.CODCLI=uppernew.CODCLI; new.NAME=uppernew.NAME; 终止
查看此示例。

create BEFORE UPDATE或INSERT TRIGGER-请参阅上面的“$erp_codcli”,“$erp_codcli”-这里似乎有两个错误。1 UPPER函数有一个参数,因此您必须调用它两次,每个参数调用一次-值UPPER'$erp_codcli',UPPER'$erp_codcli'-2字符串拼接是非常脆弱和危险的技术,使您的程序不可预测和不可靠!使用SQL参数。你没有透露你的编程语言,但你可能会发现很多例子在你的问题的文本和标题互相矛盾。文本表示您希望创建[insert]查询模式,而标题表示您需要一个触发器,该触发器将在查询后工作,并覆盖查询插入的任何值。这两种选择都是可行的,但它们是不同的approaches@Arioch“你说得对,第一点!第二,我会读更多,我是如何学习的,很多细节没有被注意到。第三,习语问题,我写的模式是DB中的视图标准化。好吧,现在视图。。。。事实上,view是另一种类型的SQL对象,如在CREATE view ENTIDADE_UPPER中选择UPPERCODCLI作为CODCLI,UPPERNAME作为ENTIDADE_001中的NAME,以及后来从ENTIDADE_UPPER中选择*,这应该是完成任务的另一种、第三种可能的方法:-因此,在选择单词时要小心,在SQL上下文中已经保留了许多单词,它们将意味着你在头脑中可能会有不同的目标坦率地说,SQL注入——你刚才提到的——可能不会被很多人认真看待,因为外星人不会进入这里的环境,或者因为他们是新手,急切地想至少先让一些东西工作起来。就我个人而言,我发现所有类型的数据类型,尤其是日期/时间和空转换,都是三个准备重用的查询的第三个反对拼接的实际论点。这两个都是正确的,这是一个测试,但不是最好的方法。我将学习有关创建干净代码的更多内容:谢谢你@Arioch'The和Mark Rotterveel