我正在尝试创建一个过程,以便从方案中全面撤消过程的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个条目的唯一其他方法是通过批处理文件,我想,过程可能是实现这一点的一种更干净的方式。我真的很感激任何帮助,无论是这个错误或代码本身。
1条答案
按热度按时间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
子句。使用复合语句最简单的方法是(您不需要为此创建例程):