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

Unable to create DB2 Procedure through command line

我正在尝试创建一个过程来全面撤销模式中过程的 executeauth。这符合尝试保护不受限制的数据库。

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 中为 PUBLIC 撤销 310 个条目的唯一其他方法是通过批处理文件,我想,过程可能是实现此目的的更简洁的方法。对于此错误或代码本身的任何帮助,我将不胜感激。

很多问题。

如错误消息所示,您无法在 SYSFUN 架构中创建例程。您收到此消息是因为在您的会话中声明了 VALUES CURRENT SCHEMA returns SYSFUN。您必须在 CREATE 之前 运行 SET SCHEMA SOME_VALID_SCHEMA_NAME 语句或使用完全限定的例程名称,例如 SOME_VALID_SCHEMA_NAME.PROC_REV.

例程中未定义变量 v_GrantQuery

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

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#