IBM DB2 PLSQL:如何检查并删除已存在的联邦对象
IBM DB2 条件删除联邦对象的最佳实现方式
要安全删除指定的联邦对象(昵称、用户映射、服务器、包装器)且避免对象不存在报错,需按依赖反向顺序执行删除操作(先删最底层的依赖对象,再删上层对象),同时通过DB2系统视图检查对象是否存在,仅在存在时执行删除。
具体实现脚本
begin -- 1. 删除昵称ASSIGN:先检查是否存在 if exists (select 1 from SYSCAT.NICKNAMES where NICKNAME = 'ASSIGN') then execute immediate 'DROP NICKNAME ASSIGN'; end if; -- 2. 删除PUBLIC用户映射:检查对应SERVER的映射是否存在 if exists (select 1 from SYSCAT.USERMAPPINGS where SERVERNAME = 'SERVER390' and AUTHID = 'PUBLIC') then execute immediate 'DROP USER MAPPING FOR PUBLIC SERVER SERVER390'; end if; -- 3. 删除服务器SERVER390:检查服务器是否存在 if exists (select 1 from SYSCAT.SERVERS where SERVERNAME = 'SERVER390') then execute immediate 'DROP SERVER SERVER390'; end if; -- 4. 删除包装器MY_WRAPPER:检查包装器是否存在 if exists (select 1 from SYSCAT.WRAPPERS where WRAPPERNAME = 'MY_WRAPPER') then execute immediate 'DROP WRAPPER MY_WRAPPER'; end if; end /
关键说明
- 删除顺序:必须遵循「昵称 → 用户映射 → 服务器 → 包装器」的顺序,因为这些对象存在依赖关系:昵称依赖服务器,服务器依赖包装器,用户映射绑定到服务器,反向删除可避免因依赖导致的删除失败。
- 存在性检查:通过DB2内置的系统视图(
SYSCAT.NICKNAMES、SYSCAT.USERMAPPINGS、SYSCAT.SERVERS、SYSCAT.WRAPPERS)判断对象是否存在,确保仅在对象真实存在时执行DROP操作,彻底避免「对象不存在」的报错。 - 大小写注意:DB2的系统视图中对象名称默认是大写存储,因此检查时需使用大写的对象名(如果创建时用了小写,需用双引号包裹,比如
NICKNAME = "assign")。
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

