Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Can';不创建触发器_Oracle - Fatal编程技术网

Oracle Can';不创建触发器

Oracle Can';不创建触发器,oracle,Oracle,我需要创建一个脚本来删除数据库中的一些数据,表没有级联约束,我没有编辑它们的权限。 因此,我试图创建一个触发器来模拟表上的级联删除(我将在脚本执行后删除它) 这是我的扳机: CREATE TRIGGER delete_workspace_on_delete_result BEFORE DELETE ON RESULT FOR EACH ROW BEGIN DELETE FROM WORKSPACE WHERE workspace_result_id = :old.id; END; / 我不

我需要创建一个脚本来删除数据库中的一些数据,表没有级联约束,我没有编辑它们的权限。 因此,我试图创建一个触发器来模拟表上的级联删除(我将在脚本执行后删除它)

这是我的扳机:

CREATE TRIGGER delete_workspace_on_delete_result
BEFORE DELETE ON RESULT
FOR EACH ROW
BEGIN
  DELETE FROM WORKSPACE WHERE workspace_result_id = :old.id;
END;
/
我不明白为什么它不起作用,我只是遵循Oracle文档,但我有以下错误:

Error report -
ERROR: syntax error at or near "BEGIN"
  Position: 87
我不习惯使用Oracle,但我自己找不到一种方法来实现这一点。

我看不出有什么不对,它是有效的。尽管:

  • 无法在Oracle 11g或更低版本上工作,因为触发器名称太长(最多30个字符)
    • 将在12c及以上温度下工作
  • 考虑使用
    创建或替换
    ;如果它存在,您尝试再次创建它,它将失败
11g上的演示:

SQL> CREATE TABLE workspace (workspace_result_id NUMBER);

Table created.

SQL> CREATE TABLE result (id NUMBER);

Table created.

SQL> CREATE TRIGGER delete_workspace_on_delete_result
  2     BEFORE DELETE
  3     ON RESULT
  4     FOR EACH ROW
  5  BEGIN
  6     DELETE FROM WORKSPACE
  7           WHERE workspace_result_id = :old.id;
  8  END;
  9  /
CREATE TRIGGER delete_workspace_on_delete_result
               *
ERROR at line 1:
ORA-00972: identifier is too long


SQL> CREATE TRIGGER delete_workspace_on_del_result
  2     BEFORE DELETE
  3     ON RESULT
  4     FOR EACH ROW
  5  BEGIN
  6     DELETE FROM WORKSPACE
  7           WHERE workspace_result_id = :old.id;
  8  END;
  9  /

Trigger created.

SQL>
我看不出有什么不对劲,它是有效的。尽管:

  • 无法在Oracle 11g或更低版本上工作,因为触发器名称太长(最多30个字符)
    • 将在12c及以上温度下工作
  • 考虑使用
    创建或替换
    ;如果它存在,您尝试再次创建它,它将失败
11g上的演示:

SQL> CREATE TABLE workspace (workspace_result_id NUMBER);

Table created.

SQL> CREATE TABLE result (id NUMBER);

Table created.

SQL> CREATE TRIGGER delete_workspace_on_delete_result
  2     BEFORE DELETE
  3     ON RESULT
  4     FOR EACH ROW
  5  BEGIN
  6     DELETE FROM WORKSPACE
  7           WHERE workspace_result_id = :old.id;
  8  END;
  9  /
CREATE TRIGGER delete_workspace_on_delete_result
               *
ERROR at line 1:
ORA-00972: identifier is too long


SQL> CREATE TRIGGER delete_workspace_on_del_result
  2     BEFORE DELETE
  3     ON RESULT
  4     FOR EACH ROW
  5  BEGIN
  6     DELETE FROM WORKSPACE
  7           WHERE workspace_result_id = :old.id;
  8  END;
  9  /

Trigger created.

SQL>