我是PL / SQL游戏的新手,我正在尝试创建一个简短的脚本来创建登录并授予只读/读写权限(根据需要进行必要的授权)。但是,我遇到了变量范围问题。有人可以帮助我做错了吗?
Snipped如下:
DECLARE CNT INTEGER;
BEGIN
SELECT COUNT(*)
INTO CNT
FROM dba_users
WHERE username = :ParamUserName
IF (CNT > 0) THEN
IF (INSTR(:ParamSelectedRole, 'WRITE') = 0) THEN
REVOKE UNLIMITED TABLESPACE FROM :ParamUserName;
REVOKE READ_WRITE FROM :ParamUserName;
GRANT READ_ONLY TO :ParamUserName;
ELSE
GRANT UNLIMITED TABLESPACE TO :ParamUserName;
END IF;
ELSE
CREATE USER :ParamUserName DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP IDENTIFIED BY ":ParamUserPassword" PROFILE ELEV_USER;
ALTER USER :ParamUserName PASSWORD EXPIRE;
GRANT :ParamSelectedRole TO :ParamUserName;
GRANT CREATE SESSION TO :ParamUserName;
IF (INSTR(:ParamSelectedRole, 'WRITE') > 0 ) THEN
GRANT UNLIMITED TABLESPACE TO :ParamUserName;
END IF;
END IF;
END;
我正在使用ODP.NET进行变量赋值并使用OracleCommand.Parameters.Add()
答案 0 :(得分:2)
所有DDL语句(GRANT,REVOKE,CREATE和ALTER)都需要处于EXECUTE IMMEDIATE中,例如
EXECUTE IMMEDIATE 'REVOKE UNLIMITED TABLESPACE FROM '||:ParamUserName;
和
EXECUTE IMMEDIATE 'ALTER USER '||:ParamUserName||' PASSWORD EXPIRE';
实际上,我会稍微简化它,并在开始时将所有外部变量放在一个地方。
DECLARE
V_CNT INTEGER;
V_USER VARCHAR2(30);
V_ROLE VARCHAR2(30);
BEGIN
--
V_USER := :ParamUserName;
V_ROLE := :ParamSelectedRole;
V_PWD := :ParamUserPassword;
--
SELECT COUNT(*)
INTO V_CNT
FROM dba_users
WHERE username = v_user
IF (CNT > 0) THEN
IF (INSTR(v_role, 'WRITE') = 0) THEN
EXECUTE IMMEDIATE 'REVOKE UNLIMITED TABLESPACE FROM '||v_user;
EXECUTE IMMEDIATE 'REVOKE READ_WRITE FROM '||v_user;
EXECUTE IMMEDIATE 'GRANT READ_ONLY TO '||v_user;
ELSE
EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO '||v_user;
END IF;
ELSE
EXECUTE IMMEDIATE 'CREATE USER '||v_user||
'DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP '||
'IDENTIFIED BY '||v_pwd||' PROFILE ELEV_USER';
EXECUTE IMMEDIATE 'ALTER USER '||v_user||' PASSWORD EXPIRE;
EXECUTE IMMEDIATE 'GRANT '||v_role||' TO '||v_user;
EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||v_user;
IF (INSTR(v_role, 'WRITE') > 0 ) THEN
EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO '||v_user;
END IF;
END IF;
END;