CREATE OR REPLACE VIEW admin.v_view_dependency AS
SELECT DISTINCT srcobj.oid AS src_oid
, srcnsp.nspname AS src_schemaname
, srcobj.relname AS src_objectname
, tgtobj.oid AS dependent_viewoid
, tgtnsp.nspname AS dependant_schemaname
, tgtobj.relname AS dependant_objectname
FROM pg_class srcobj
JOIN pg_depend srcdep ON srcobj.oid = srcdep.refobjid
JOIN pg_depend tgtdep ON srcdep.objid = tgtdep.objid
JOIN pg_class tgtobj ON tgtdep.refobjid = tgtobj.oid AND srcobj.oid <> tgtobj.oid
LEFT JOIN pg_namespace srcnsp ON srcobj.relnamespace = srcnsp.oid
LEFT JOIN pg_namespace tgtnsp ON tgtobj.relnamespace = tgtnsp.oid
WHERE tgtdep.deptype = 'i'::"char" AND tgtobj.relkind = 'v'::"char";
字符串 然后,
select top 99 * from admin.v_view_dependency where src_objectname like '%the_table_name_it_complaint_about%';
5条答案
按热度按时间h5qlskok1#
使用
cascade
选项:字符串
这将删除引用
users
表或使用它的任何视图的任何外键。它不会删除其他 * 表 *(或从中删除行)。
ogq8wdun2#
如果真的需要删除该特定表,无论是否重新创建它,那么首先找到依赖于它的对象。
字符串
然后,
型
结果集将在字段“dependent_objectname”中显示依赖对象。
l5tcr1uw3#
一般来说,要删除几个相互依赖的表,你可以从没有依赖的表开始(那些有指向其他表的外键的表),然后向后操作。例如,如果表
transactions
依赖于表users
,你应该先删除transactions
。简而言之:按照创建表的相反顺序删除表。如果您设法创建具有循环依赖关系的表,则可以首先删除阻止删除的外键约束。(正如@a_horse在评论中解释的那样),将删除涉及已删除表的任何外键约束。但请注意,并非所有DBMS都支持
CASCADE
:Postgres可以,但MySQL不可以(关键字被接受,但没有效果)。sqxo8psd4#
使用以下命令:
字符串
根据这里的供应文件。
ecfdbz9o5#
我创建了
my_func()
触发器函数,如下所示:字符串
然后,我在
test
表上使用my_func()
创建了my_t
触发器,如下所示:型
然后,我尝试删除
my_func()
触发器函数,如下所示:型
但是,我得到了下面类似的错误:
错误:无法删除函数my_func(),因为其他对象依赖于它
表测试上的触发my_t取决于函数my_func()
提示:使用DROP ... CASCADE也删除依赖对象。
所以,我设置
CASCADE
如下所示,然后我可以删除my_func
触发器函数和my_t
触发器一起没有错误。* The doc详细解释了如何删除函数:型
或者首先,我在
test
表中删除了my_t
触发器,如下所示。* The doc详细说明了如何删除触发器:型
然后,我可以删除
my_func()
触发器函数而不会出错,如下所示:型