背景说明
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();