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