目前,SQL允许您在插入或更新记录时使用关键字DEFAULT,以告诉数据库只使用列的默认数据类型值:
UPDATE TABLE SET COL_A = DEFAULT, COL_B = 'hello' WHERE ID = 123
Run Code Online (Sandbox Code Playgroud)
例如,如果COL_A的数据类型为VARCHAR2,则该语句将在COL_A中插入NULL.
但是,如果我想执行更新,但保持COL_A不变,该怎么办?我知道你可能会说,只需从更新语句中删除COL_A即可.但是,让我们假设COL_A必须在声明中.是否有一个关键字让SQL知道保持COL_A的值不变?
例如,我认为它可能是这样的:
UPDATE TABLE SET COL_A = NOCHANGE, COL_B = 'hello' WHERE ID = 123
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用.
如果存储过程旨在缓解SQL注入攻击,为什么在存储过程中允许EXECUTE IMMEDIATE?以下问题的接受答案是将它们作为抵御此类攻击的一步:
什么是存储过程? /sf/answers/32167201/
"存储过程还具有安全性,因为您可以向存储过程授予执行权限,但用户不需要对基础表具有读/写权限.这是针对SQL注入的良好的第一步."
...除非存储过程使用EXECUTE IMMEDIATE.
此PL/SQL代码返回产品的描述(第二个参数).
CREATE OR REPLACE PROCEDURE prodDescr(vname IN VARCHAR2, vresult OUT VARCHAR2) AS
vsql VARCHAR2(4000);
BEGIN
vsql := 'SELECT description FROM products WHERE name=''' || vname || '''';
EXECUTE IMMEDIATE vsql INTO vresult;
END;
Run Code Online (Sandbox Code Playgroud)
恶意用户输入.
A' AND 1=2 UNION SELECT password FROM members WHERE username='admin
Run Code Online (Sandbox Code Playgroud)
生成的查询.
SELECT description FROM products WHERE name='A' OR 1=2 UNION SELECT password FROM members WHERE username='admin'
Run Code Online (Sandbox Code Playgroud)
执行查询时,攻击者获取管理员密码.
正如您所看到的,虽然我们使用了存储过程,但是攻击者仍然可以像使用PHP中的某些SELECT语句连接而不是清理输入那样轻松地利用漏洞.对我来说,向开发人员说存储过程有助于保护数据库安全,这似乎是非常误导的.
当所有表格单元格位于 class="p1" 的表格内时,我想为所有表格单元格设置背景颜色:蓝色的样式。以下工作,但很长:
table.p1 > tbody > tr > td,
table.p1 > thead > tr > td,
table.p1 > tbody > tr > th,
table.p1 > thead > tr > th{
background-color:blue;
}
Run Code Online (Sandbox Code Playgroud)
是否有更短/更优雅的方式来定义此 CSS 规则?
编辑:只有表“p1”直接包含的表单元格可以设置样式,并且没有其他子项(例如这些单元格内的嵌套表)
我有这个Oracle SQL语句来获取最早的3个日期:
SELECT LEAST(DATE_1,DATE_2,DATE_3) FROM MYTABLE
Run Code Online (Sandbox Code Playgroud)
但是,如果其中一个日期为NULL,则无论其他日期是否为NULL,整个LEAST函数都将返回NULL.我想获得三个日期中最早的日期,但忽略任何NULL日期,以便LEAST唯一的时间返回NULL是所有三个日期都为NULL.
我也不能有函数返回不正确的日期,因此这将不会工作:
SELECT LEAST(NVL(DATE_1,SYSDATE),NVL(DATE_2,SYSDATE),NVL(DATE_3,SYSDATE)) FROM MYTABLE
Run Code Online (Sandbox Code Playgroud)
最干净的方法是什么?