2013-05-24 6 views
1

프로 시저 내 사용자 테이블에서 오라클 사용자를 생성하려면 triyin입니다. 문제는 특정 열을 호출하는 방법을 모른다는 것입니다. 나는 Camp.user.username과 그 물건으로 시험해 보았다.즉시 실행 문장의 매개 변수 (프로 시저 내부)

create or replace 
PROCEDURE PR_USERPASS AS 
BEGIN 
    UPDATE CAMP.USERS 
    SET USERNAME = (DBMS_RANDOM.string('x',15)), PASS = DBMS_RANDOM.string('x',12); 
    EXECUTE IMMEDIATE 'CREATE USER ' || USERNAME || ' IDENTIFIED BY ' || PASSWORD; 
    EXECUTE IMMEDIATE 'Grant connect to ' || USERNAME; 
END PR_USERPASS; 

어쨌든 동일한 절차에서 해당 참조를 호출 할 수 있습니까? 미리 감사드립니다.

답변

1

cursor을 사용하여 Camp.Users 테이블을 반복하고 해당 열을 액세스하십시오. 귀하의 코드는이 (테스트되지 않은) 같은 것을 갈 것 :

create or replace 
PROCEDURE PR_USERPASS AS 
BEGIN 
    UPDATE CAMP.USERS 
    SET USERNAME = (DBMS_RANDOM.string('u',15)), PASS = DBMS_RANDOM.string('x',12); 
    FOR userRow IN (SELECT Username, Pass FROM Camp.Users) LOOP 
    EXECUTE IMMEDIATE 'CREATE USER ' || userRow.Username || ' IDENTIFIED BY ' || userRow.Pass; 
    EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || userRow.Username; 
    END LOOP; 
END PR_USERPASS; 

부록 : 원래의 대답은 사용자 이름과 암호 숫자와 숫자를 할 수 DBMS_Random.String('x', 15), 같은 USERNAME을 생성. 사용자 이름이 숫자로 시작되면 이로 인해 문제가 발생했습니다. 대답은 DBMS_Random.String('u', 15)을 사용하여 Oracle에서 허용되는 사용자 이름 값만 생성하도록 변경되었습니다. 암호는 선행 숫자로 확인되었습니다. 숫자로 시작하는 사용자 이름이 원하는 경우

, 단지 큰 따옴표로 이름을 둘러싸 : 표준이 아닌 사용자 이름을 갖는 것은 좋은 생각 인 경우 말했다

 EXECUTE IMMEDIATE 'CREATE USER "' || userRow.Username || '" IDENTIFIED BY ' || userRow.Pass; 
    EXECUTE IMMEDIATE 'GRANT CONNECT TO "' || userRow.Username || '"'; 

, 나는 확실하지 않다.

DBMS_Random.String에 대한 문서는 here입니다.

+0

컴파일되었지만 작동하지 않습니다. '사용자 또는 역할 이름이 예상되었습니다.' – Sergiodiaz53

+0

나는 사용자 생성 (: a) IDENTIFIED BY (: b)를 실행하고 userRow.USERNAME, userRow.PASS를 사용해 보았습니다. 여전히 작동하지 않습니다. – Sergiodiaz53

+0

'ORA-01935' 오류입니까? 이 경우 DBMS_Random.String ('x', length)'는 문자와 숫자로 값을 반환하고, 첫 번째 문자가 숫자이면 사용자 이름이나 암호에 유효한 이름이 아니기 때문일 수 있습니다. 번호로 시작하는 사용자 이름이나 비밀번호를 원하십니까? 어쨌든 괜찮습니다. 그냥 알려 주시면 업데이트를 게시하겠습니다. –