create or replace trigger trig1
before delete or insert or update on students
begin
if( To_char(sysdate,'day') = 'monday' then
raise_application_error(-20500,'table is secured');
end if;
end;
我创建了触发器但它不适用于monday
并且它在表上执行DML操作。我找到了一个解决方案 - 使用dy而不是白天 - 但为什么?
答案 0 :(得分:4)
有两个原因。
当您使用day
时,结果会用空格填充到最长名称,请尝试
SELECT '"'||To_char(sysdate, 'day')||'"'
FROM dual;
"monday "
使用'fmday'
来避免这种情况。
然后TO_CHAR()
的结果取决于当前用户会话NLS_DATE_LANGUAGE
设置。使用
To_char(sysdate, 'fmday', 'NLS_DATE_LANGUAGE = american') = 'monday'`
以独立于当前用户会话的设置。
答案 1 :(得分:3)
Wernfried Domscheit has answered "why"您的查询无效(TO_CHAR( datevalue, 'DAY' )
右侧填充空格)。
您可以截断日期并将其与ISO周的开头(通常是星期一)进行比较,而不是依赖NLS_DATE_LANGUAGE
和NLS_TERRITORY
设置,如果查询在国际上使用可能会中断)这与这些设置无关:
create or replace trigger trig1
before delete or insert or update on students
begin
IF TRUNC( SYSDATE ) = TRUNC( SYSDATE, 'IW' ) THEN
raise_application_error(-20500,'table is secured');
END IF;
end;
/
答案 2 :(得分:0)
您可以使用日期代码:
msbuild test.sln /t:Rebuild /p:Configuration=Debug
文档:https://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00210
D - 星期几(1-7)。此元素取决于会话的NLS区域。