Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/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
如何在PostgreSQL中通过表的对象标识符(OID)删除表?_Postgresql - Fatal编程技术网

如何在PostgreSQL中通过表的对象标识符(OID)删除表?

如何在PostgreSQL中通过表的对象标识符(OID)删除表?,postgresql,Postgresql,我想删除PostgreSQL中的一个隐藏表,使用它的OID,比如16417。我该怎么做 通过使用将OID映射到regclass,我可以看到该表的存在 SELECT 16417::regclass; 我得到了一个 regclass -------------------------- cyanaudit.tb_audit_field (1 row) 我怎么才能放下这个?我尝试使用drop table cyanaudit.tb\u audit\u字段但它不起

我想删除PostgreSQL中的一个隐藏表,使用它的OID,比如16417。我该怎么做

通过使用将OID映射到regclass,我可以看到该表的存在

SELECT 16417::regclass;
我得到了一个

         regclass         
--------------------------
 cyanaudit.tb_audit_field
(1 row)
我怎么才能放下这个?我尝试使用
drop table cyanaudit.tb\u audit\u字段但它不起作用,给出以下消息

ERROR:  relation "cyanaudit.tb_audit_field" does not exist
LINE 1: ... distinct table_schema ) end                 from cyanaudit....
                                                             ^
QUERY:  select case when in_schema is not null then ARRAY[ in_schema ] else array_agg( distinct table_schema ) end                 from cyanaudit.tb_audit_field
CONTEXT:  PL/pgSQL function cyanaudit.fn_update_audit_fields(character varying) line 1 at SQL statement
SQL statement "SELECT cyanaudit.fn_update_audit_fields()"
PL/pgSQL function cyanaudit.fn_update_audit_fields_event_trigger() line 1 at PERFORM
虽然它显示表不存在,但我仍然得到

         regclass         
--------------------------
 cyanaudit.tb_audit_field
(1 row)
每当我询问

SELECT 16417::regclass;

任何输入?

看起来像是一个事件触发器干扰了您的操作

当执行像
DROP TABLE
这样的DDL语句时,会运行事件触发器

在本例中,它似乎是在DDL操作之后运行的事件触发器

事件触发器函数尝试对触发它的表执行某些操作,但由于您删除了该表,该函数失败(这可能是触发器函数中的错误)

由于事件触发器失败,整个事务(包括
DROP TABLE
)被回滚,因此该表并没有真正被删除


您需要禁用或删除该事件触发器或修复触发器功能,以便可以删除该表。

看起来像是操作中的事件触发器

当执行像
DROP TABLE
这样的DDL语句时,会运行事件触发器

在本例中,它似乎是在DDL操作之后运行的事件触发器

事件触发器函数尝试对触发它的表执行某些操作,但由于您删除了该表,该函数失败(这可能是触发器函数中的错误)

由于事件触发器失败,整个事务(包括
DROP TABLE
)被回滚,因此该表并没有真正被删除


您需要禁用或删除该事件触发器或修复触发器功能,以便可以删除该表。

如何删除触发器?例如,如果我的触发器是:tr_after_audit_field_change after INSERT或UPDATE ON cyanaudit.tb_audit_field为每行执行过程cyanaudit.fn_after_audit_field_change(),我删除了触发器,但仍无法删除表格常规DML触发器不是您的问题。使用
psql
中的
\dy
查看事件触发器。您的问题是触发函数cyanaudit.fn\u update\u audit\u fields\u event\u trigger()
的问题。谢谢您的帮助。你是个救生员。我禁用了所有触发器。我应该再次启用它们吗?如果您需要,当然可以。这不是我该说的。我如何移除触发器?例如,如果我的触发器是:tr_after_audit_field_change after INSERT或UPDATE ON cyanaudit.tb_audit_field为每行执行过程cyanaudit.fn_after_audit_field_change(),我删除了触发器,但仍无法删除表格常规DML触发器不是您的问题。使用
psql
中的
\dy
查看事件触发器。您的问题是触发函数cyanaudit.fn\u update\u audit\u fields\u event\u trigger()的问题。谢谢您的帮助。你是个救生员。我禁用了所有触发器。我应该再次启用它们吗?如果您需要,当然可以。这不是我该说的。