无法通过命令行创建 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#
我正在尝试创建一个过程来全面撤销模式中过程的 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#