南大通用GBase8s 常用SQL语句(126)

    1. DROP ROLE 语句

使用 DROP ROLE 语句从数据库中删除用户定义的角色。

该语句是 SQL ANSI/ISO 标准的扩展。

语法

 

元素

描述

限制

语法

role

要删除的角色的名称

必须在本地数据库中注册,当前 role 名称用引号括起时,它是区分大小写的。

所有者名称

用法

DBA 或者用 WITH GRANT OPTION 关键字授予角色的用户可以发出 DROP ROLE 语句。(如 user 名称一样,role 是授权标识而不是数据库对象,因为 role 没有所有者。)

如果您包含了可选的 IF EXISTS 关键字,则如果未在当前数据库中注册指定的名称的角色 ,则数据库不执行任何操作(而不是向应用程序发送异常)。

在您删除角色后,没有用户可以授权或启用已删除的角色,而且当前角色被删除后,任何被指定了该角色的用户将失去它的特权(如表级别特权或例程级别特权)。除非单独对 PUBLIC 或用户授予相同的权限。如果已删除的角色时用户的缺省角色,则该用户的缺省角色变成 NULL。

以下语句删除了 engineer 角色:

DROP ROLE engineer;

您不能使用 DROP ROLE 语句删除内置的角色,例如 EXTEND 或 GBase 8s 的 DBSECADM 角色。

    1. DROP ROUTINE 语句

使用 DROP ROUTINE 语句从数据库中删除用户定义的例程(UDR)。

该语句是 SQL ANSI/ISO 标准的扩展。

语法

 

元素

描述

限制

语法

owner

UDR 所有者的名称

必须拥有 UDR

所有者名称

parameter_type

routine 参数的数据类型

数据类型(或数据类型列表)必须与 UDR 定义中的数据类型是相同类型(并且以相同的顺序指定)

标识符; 数据类型

routine

要删除的 UDR 的名称

UDR 必须在数据库中存在(即已注册)

标识符

用法

删除 UDR 会从数据库中除去 UDR 的文本和可执行的版本。如果不指定 UDR 是用户定义的函数还是用户定义的过程,则此语句指导服务器删除指定的用户定义的函数或用户定义的过程。

要使用 DROP ROUTINE 语句,您必须是 UDR 的所有者(并且持有数据库的 Resource 特权),或者您必须具有 DBA 特权。您还必须持有编写此 UDR 的程序语言的 Usage 特权。要删除外部的用户定义的例程,请参阅删除外部例程.。

限制

您无法从相同的 SPL 例程内删除 SPL 例程。

您不能使用 DROP ROUTINE 、DROP FUNCTION 或 DROP PROCEDURE 语句删除受保护的例程。有关受保护例程的更多信息,请参阅 GBase 8s SQL 参考指南 中系统目录表 sysprocedures 的描述。

要使用 DROP ROUTINE 语句注销 UDR,UDR 的类型不能含糊不清。您指定的 UDR 的名称必须引用用户定义的函数或用户定义的过程。如果存在以下任何一个条件,则数据库服务器会返回一个错误:

  1. 您指定的名称(或参数)同时应用于用户定义的过程和用户定义的函数。
  2. 您指定的 specific 名称同时应用于用户定义的过程和用户定义的函数。

如果例程名称在数据库内不唯一,则您必须指定足够的 parameter_type 信息以区分这些名称。如果数据库服务器无法解析一个意义含糊的 UDR 名称,即它的签名与另一个 UDR 的签名只是在一个未命名的 ROW 类型参数中不同,则返回一个错误。(当定义了含义模糊的 function 或 procedure 时,数据库服务器不能预期此错误。)

如果使用参数类型来标识 UDR,则这些参数数据类型应跟在 UDR 名称后面,如下例所示:

DROP ROUTINE compare(INT, INT);

如果您对 UDR 使用特定的名称,则必须包含关键字 SPECIFIC ,如下例所示:

DROP SPECIFIC ROUTINE compare_point;

如果您包含了可选的 IF EXISTS 关键字,则如果数据库服务器在当前数据库中没有找到与 DROP ROUTINE 语句指定的相符合的函数则数据库不采取任何操作(而不是发出错误)。

确定例程是否存在

在您尝试删除用户定义的例程之前,可以通过查询系统目录来检查此例程是否在数据库中存在。以下示例中,SELECT 语句从 sysprodures 表中检索标识为 MyRoutine 的任何例程:

SELECT * FROM sysprocedures WHERE procname = MyRoutine;

        

如果此查询返回一行,则名为 MyRoutine 的 UDR 注册在当前数据库中。

如果没有返回行,则您无需发出 DROP ROUTINE 语句,但是您可能希望验证 WHERE 子句指定的名称是否正确,以及您是否连接到正确的数据库。

如果此查询返回多行,则在当前数据库中重载例程 MyRoutine ,并且您需要检查 MyRoutine 例程的属性以确定它们中的哪些(如果有)需要通过 DROP ROUTINE 语句注销。

删除外部例程

以 C 语言或 Java™ 语句编写用户定义的例程(UDR)称为外部例程。外部例程必须包含指定共享对象文件名的外部例程引用子句。在缺省情况下,只有 DBSA 授予了内置的 EXTEND 角色的用户可以创建或删除外部例程。您还必须具有编写此 UDR 的外部程序语言的 Usage 特权。有关 EXTEND 角色安全功能的其它信息请参阅 授予 EXTEND 角色。有关 C 语言或 Java 语言的 USAGE ON LANGUAGE 子句的语法使用,请参阅 语言级权限 。

要从共享内存中删除 C 语言例程的可执行版本,请调用 IFX_UNLOAD_MODULE 函数。要用另一个例程替换可执行版本的 C 例程,请调用 IFX_REPLACE_MODULE 函数。这些内置函数都在 UDR 定义例程中有所描述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值