背景说明

PolarDB普通触发器不支持DDL语句,如:DROP、CREATE、ALTER等,需要修改为PolarDB的事件触发器。

解决方案

PolarDB事件触发器语法如下表所示:
CREATE EVENT TRIGGER name
    ON event
    [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]
    EXECUTE { FUNCTION | PROCEDURE } function_name()
说明
  • 支持的event包含ddl_command_start、ddl_command_end、 table_rewrite和sql_drop。
  • ddl_command_start事件就在CREATE、 ALTER、DROP、SECURITY LABEL、 COMMENT、GRANT或者REVOKE 命令的执行之前发生。在事件触发器引发前不会做受影响对象是否存在的检查。
  • ddl_command_end事件就在同一组命令的执行之后发生。
  • sql_drop事件为任何删除数据库对象的操作在 ddl_command_end事件触发器之前发生。
  • table_rewrite事件在表被命令ALTER TABLE和 ALTER TYPE的某些动作重写之前发生。

示例

在Oracle中:
create or replace trigger apps_no_ddl
before create or alter or drop or truncate
on database
begin
raise_application_error(-20001,'不允许用DDL操作APPS用户的对象');
end;
在PolarDB中:
CREATE OR REPLACE FUNCTION abort_any_command()
  RETURNS event_trigger
 LANGUAGE plpgsql
  AS $$
BEGIN
  RAISE EXCEPTION 'command % is disabled', tg_tag;
END;
$$;

CREATE EVENT TRIGGER apps_no_ddl ON ddl_command_start
   EXECUTE FUNCTION abort_any_command();