无法通过命令行创建DB2过程



我正在尝试创建一个过程,以便对模式中的过程执行完全撤销。这与试图保护非受限数据库的安全是一致的。

CREATE PROCEDURE PROC_REV
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE v_NAME VARCHAR(400);
FOR v1 AS
c1 CURSOR FOR
select specificname from SYSCAT.ROUTINEAUTH where grantee='PUBLIC' and schema='SYSPROC' and routinetype='P'
DO
SET v_NAME = specificname;
SET v_GrantQuery = 'revoke execute on specific procedure '|| v_NAME ||' from PUBLIC';
EXECUTE IMMEDIATE v_GrantQuery;
END FOR;
END#

这是我用上面的代码运行的处理文件的命令。

db2 -td# -svf RoutineAuthRevoke.db2

然而,我一直遇到这个错误

SQL0553N An object cannot be created with the schema name "SYSFUN  ". LINE NUMBER=1. SQLSTATE 42939

我是DB2的新手,这是我第一次尝试编写DB2过程脚本。有人能认出";SYSFUN";因为我肯定做不到。我可以从SYSPROC for PUBLIC中撤销310个条目的唯一其他方法是通过批处理文件,我认为过程可能是实现这一点的更干净的方法。我真的很感激任何关于这个错误或代码本身的帮助。

许多问题。

无法在SYSFUN模式中创建例程,如错误消息所示。收到此消息是因为语句VALUES CURRENT SCHEMA在会话中返回SYSFUN。必须在CREATE之前运行SET SCHEMA SOME_VALID_SCHEMA_NAME语句,或者使用完全限定的例程名(如SOME_VALID_SCHEMA_NAME.PROC_REV(。

例程中未定义变量v_GrantQuery

根据REVOKE(例程特权(语句的语法,您应该使用完全限定的例程名称并在末尾使用RESTRICT子句来生成REVOKE语句。使用复合语句最简单的方法(不需要为此创建例程(:

BEGIN
FOR v1 AS
select 'REVOKE EXECUTE ON SPECIFIC PROCEDURE "' || schema ||'"."'|| specificname || '" FROM PUBLIC RESTRICT' AS STMT
from SYSCAT.ROUTINEAUTH 
where grantee='PUBLIC' and schema='SYSPROC' and routinetype='P'
DO
EXECUTE IMMEDIATE v1.STMT;
END FOR;
END#

最新更新