小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
第三十九章 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
复制代码