在Oracle中限制周日创建表的方法是什么?

3
问题:创建一个使用触发器的PL/SQL代码,以限制在星期日创建任何表。

我尝试过了。
CREATE OR REPLACE TRIGGER sunday_trigger
BEFORE CREATE ON ALSPRD
  FOR EACH ROW
  DECLARE
  v_day DATE := TRUNC(SYSDATE);
  BEGIN
    IF TO_CHAR(v_day,'DY')IN ('SUN') THEN
      REVOKE create table from harsh;
    END IF;
  EXCEPTION
  WHEN OTHERS THEN
  dbms_output.put_line('Error is:'||SQLERRM);
  END; 

出现错误: ORA-30506: 系统触发器不能基于表或视图


你有没有阅读 Oracle 创建触发器的文档?你需要一个 DDL 触发器。你提问中的代码不是 DDL 触发器。ALSPRD 是一个数据库表的名字吗? - Abra
2个回答

3
我建议采用不同的方法。
以SYS用户身份连接,创建一个触发器,阻止用户(例如我的例子中的scott)在指定的日期(我将使用星期一,以便测试是否按计划工作)创建任何内容。
SQL> show user
USER is "SYS"
SQL>
SQL> create or replace trigger sunday_trigger
  2    before create on scott.schema
  3  begin
  4    if to_char(sysdate, 'DY', 'nls_date_language = english') = 'MON'
  5    then
  6       raise_application_error(-20000, 'You can not create any objects on Monday');
  7    end if;
  8  end;
  9  /

Trigger created.

让我们来测试一下:

SQL> connect scott/tiger
Connected.
SQL> select to_char(sysdate, 'DY', 'nls_date_language = english') today from dual;

TODAY
------------
MON

SQL> create table so_test (id number);
create table so_test (id number)
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: You can not create any objects on Monday
ORA-06512: at line 4


SQL> create or replace procedure p_test is
  2  begin
  3    null;
  4  end;
  5  /
create or replace procedure p_test is
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: You can not create any objects on Monday
ORA-06512: at line 4


SQL>

假设现在是明天(星期二):

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> select sysdate from dual;

SYSDATE
--------
21.06.21

SQL> alter system set fixed_date = '22.06.21';

System altered.

SQL> connect scott/tiger
Connected.
SQL> select to_char(sysdate, 'DY', 'nls_date_language = english') today from dual;

TODAY
------------
TUE

SQL> create table so_test (id number);

Table created.

SQL> create or replace procedure p_test is
  2  begin
  3    null;
  4  end;
  5  /

Procedure created.

SQL>

我觉得这个没问题。


1
  1. 撤销用户创建表格的权限。
  2. 创建另一个用户<OWNER_PROC>,并赋予其创建表格的权限。
  3. 创建一个过程<CREATE_TABLE_PROC>,用于创建表格,并在此过程中可以编写任何逻辑。
  4. 将<OWNER_PROC>.<CREATE_TABLE_PROC>的执行权限授予harsh。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接