文章
姚 鑫 · 十月 8 阅读大约需 4 分钟

第三十九章 SQL命令 DROP TRIGGER

第三十九章 SQL命令 DROP TRIGGER

删除触发器

大纲

DROP TRIGGER name [ FROM table ]

参数

  • name - 要删除的触发器的名称。触发器名称可以是限定的,也可以是非限定的;如果限定,则其架构名称必须与表的架构名称匹配。
  • FROM table - 可选-要从中删除触发器的表。如果指定了FROM子句,则只在表中搜索命名触发器。如果未指定FROM子句,则在NAME中指定的整个架构中搜索命名触发器。

描述

DROP TRIGGER命令删除触发器。如果要修改现有触发器,则必须先调用DROP TRIGGER删除旧版本的触发器,然后再调用CREATE TRIGGER

注:DROP TABLE删除与该表关联的所有触发器。

DROP TRIGGER命令是特权操作。用户必须具有%DROP_TRIGGER管理权限才能执行DROP TRIGGER。否则将导致SQLCODE-99错误,因为%msg用户‘name’没有%DROP_TRIGGER权限。

用户必须对指定表拥有%ALTER特权。如果用户是表的所有者(创建者),则会自动授予该用户对该表的%ALTER权限。否则,必须授予用户对该表的%ALTER特权。否则将导致SQLCODE-99错误,因为%msg用户‘name’没有更改‘Schema.TableName’的表定义所需的%ALTER特权。

如果拥有适当的授予权限,则可以使用GRANT命令分配%DROP_TRIGGER%ALTER权限。

在嵌入式SQL中,您可以使用$SYSTEM.Security.Login()方法以具有适当权限的用户身份登录:

   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )

必须具有%Service_Login:Use权限才能调用$SYSTEM.Security.Login方法。

  • DROP TRIGGER不能用于从持久类投影的表,除非表类定义包括[DdlAllowed]。否则,操作将失败,并出现SQLCODE-300错误,同时未为类‘Schema.tablename’启用%msg DDL
  • DROP TRIGGER不能用于从部署的持久类投射的表。此操作失败,并出现SQLCODE-400错误,并显示%msg Unable to Execute DDL以修改已部署的类:‘classname’

DROP TRIGGER语句获取表的表级锁。这可以防止其他进程修改表的数据。此锁在放下触发器操作结束时自动释放。

FROM 子句

触发器及其表必须驻留在同一架构中。如果触发器名称未限定,则触发器架构名称默认为与表架构相同的架构,如FROM子句中所指定。如果触发器名称是非限定的,并且没有FROM子句,或者表名也是非限定的,则触发器模式缺省为缺省模式名称;不使用模式搜索路径。如果两个名称都是限定的,则触发器架构名称必须与表架构名称相同。模式名称不匹配会导致SQLCODE-366错误;只有当触发器名称和表名都是限定的,并且它们指定了不同的模式名称时才会出现这种情况。

在SQL中,对于特定表,触发器名称在其架构内必须是唯一的。因此,在一个模式中可以有多个同名触发器。可选的FROM子句用于确定要删除的触发器:

  • 如果未指定FROM子句,并且 IRIS在架构中找到与指定名称匹配的唯一触发器,则 IRIS将删除该触发器。
  • 如果指定了FROM子句,并且 IRIS在架构中找到了与指定名称和FROM表名都匹配的唯一触发器,则 IRIS将删除该触发器。
  • 如果未指定FROM子句,并且 IRIS找到多个与指定名称匹配的触发器,则 IRIS将发出SQLCODE-365错误。
  • 如果 IRIS找不到与指定名称匹配的触发器(对于FROM子句中指定的表),或者如果没有FROM子句,则对于架构中的任何表, IRIS都会发出SQLCODE-363错误。

示例

以下示例删除与系统范围默认架构中的任何表关联的名为TRIGGER_1的触发器。(初始默认架构为SQLUser):

DROP TRIGGER Trigger_1

以下示例删除与A架构中的任意表关联的名为TRIGGER_2的触发器。

DROP TRIGGER A.Trigger_2

以下示例删除与系统范围默认架构中的Patient表关联的名为TRIGGER_3的触发器。如果找到名为TRIGGER_3的触发器,但它与患者没有关联,则IRIS会发出SQLCODE-363错误。

DROP TRIGGER Trigger_3 FROM Patient

以下示例都删除了与Test模式中的Patient表关联的名为TRIGGER_4的触发器。

DROP TRIGGER Test.Trigger_4 FROM Patient
DROP TRIGGER Trigger_4 FROM Test.Patient
DROP TRIGGER Test.Trigger_4 FROM Test.Patient
00
1 0 0 7
Log in or sign up to continue