DROP COLUMN
要从现有表中删除列,请使用带有 ALTER TABLE 命令的 DROP
COLUMN 设置。
在此命令中,删除列的语法按如下所示:
DROP [COLUMN] column_name不能删除主键列。
删除列时,需要相当数量的初步操作以标识并除去列上的任何外部依赖性。 必须通过查询相关数据库表来搜索对触发器、过程、视图以及限制过滤器中的列的任何引用。 还必须搜索探测器规则文件和网关映射文件以获取列的引用。
注:
- 如果删除触发器、过程、视图、限制过滤器或索引所依赖的列,这些依赖对象也将删除,且将有一个警告写入 ObjectServer 日志文件。 要避免无意中删除触发器、过程、视图或限制过滤器,请阅读用于删除列的以下指南。 (因为索引直接链接至列,所以删除索引的相关联列的同时将始终删除该索引)。
- ObjectServers (在 OMNIbus v8.1之前)。 修订包 8。 如果在
alerts.status上删除某个字段,那么在删除该字段之后,必须重新启动所有探测器并除去任何 SAF 文件。 ObjectServers ,位于 OMNIbus v8.1。 修订包 8 或更高版本。 探测器现在对于
alerts.status上的字段删除具有足够的弹性,并且不再需要重新启动或除去 SAF 文件。
以下指南基于想要从 ObjectServer 中的表删除 Country 列的示例方法:
- 使用 SQL 交互式界面连接至 ObjectServer(例如,OWL),如下表中所示。 缺省情况下将假设用户名,但是您必须输入密码。
表 1. 启动 SQL 交互式界面 选项 描述 UNIX 输入: $NCHOME/omnibus/bin/nco_sql -server OWL
Windows 输入: %NCHOME%\omnibus\bin\isql -S OWL
- 使用 ALTER SYSTEM BACKUP 命令将 ObjectServer 备份到临时位置(例如,/tmp/mybackup)。 这种预防措施确保您可以在必要时恢复系统。
1> alter system backup '/tmp/mybackup'; 2> go - 如
catalog.triggers表中存储的那样,列出触发器的详细信息。1> describe catalog.triggers; 2> go表中每个列的键类型、名称、数据类型和长度都将输出到屏幕。
- 检索在触发器主体或求值子句中引用
Country列的所有触发器的名称:1> select TriggerName from catalog.triggers where CodeBlock like ' Country' or EvaluateBlock like ' Country'; - 记下所有列出的触发器,并通过编辑每个触发器来除去
Country引用。 您可以从 Netcool/OMNIbus Administrator 中的 " 触发器详细信息 " 窗口 (操作 选项卡) 执行此操作。重要信息: 在进行此过程的其余步骤中描述的任何更改之前,请检查以下条件。- 模式中可能有两个或更多的表使用相同列名。 如果这样,请在执行任何更改前针对想要删除的表标识正确的触发器。
- 检查触发器之间是否不存在可能导致不想要的更改的依赖性。
- 重复步骤 3 到 5 以标识引用
Country列的任何其他对象,并除去引用的所有实例。 下表列出了需要搜索的数据库表,相关 SELECT 语句以及可用于编辑对象的 Netcool/OMNIbus Administrator 窗口。表 2. 要搜索的系统目录表, SELECT 语句和 Netcool/OMNIbus Administrator 窗口 对象类型 表名 SELECT 语句 Netcool/OMNIbus Administrator 窗口 过程 catalog.sql_procedures select ProcedureName from catalog.sql_procedures where CodeBlock like 'Country';“SQL 过程详细信息”窗口 限制过滤器 catalog.restrictions select RestrictionName from catalog.restrictions where ConditionText like 'Country';“限制过滤器详细信息”窗口 视图 catalog.views select ViewName from catalog.views where CreationText like 'Country'; - 搜索探测规则文件并除去任何列引用。
- 搜索网关映射文件 $NCHOME/omnibus/gates/objserv_type/objserv_type.map,其中 type 代表
uni或bi。 除去对列的任何引用。 - 对于 OMNIbus v8.1之前的 ObjectServers 。 修订包 8 ,停止探测器。 对于 OMNIbus v8.1上的 ObjectServers ,不需要执行此步骤。 修订包 8 或更高版本。
- 除去所有引用之后,请使用
ALTER TABLE ... DROP COLUMN语法删除Country列。 - 对于 OMNIbus v8.1之前的 ObjectServers 。 修订包 8 ,重新启动探测器。 对于 OMNIbus v8.1上的 ObjectServers 。 修订包 8 或更高版本必须告知探测器重新读取已更改的规则。 有关 对规则文件进行重读的更多信息,请参阅 https://www.ibm.com/support/knowledgecenter/en/SSSHTQ_8.1.0/com.ibm.netcool_OMNIbus.doc_8.1.0/omnibus/wip/probegtwy/task/omn_prb_rereadingrulesfile.html