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

euoag5mw  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(158)

我正在尝试创建一个过程,以便从方案中全面撤消过程的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个条目的唯一其他方法是通过批处理文件,我想,过程可能是实现这一点的一种更干净的方式。我真的很感激任何帮助,无论是这个错误或代码本身。

ct3nt3jp

ct3nt3jp1#

一系列问题。
您无法在SYSFUN方案中创建例程,如错误消息所示。之所以出现此消息,是因为VALUES CURRENT SCHEMA语句在会话中返回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#

相关问题