[Oracle] ORA-01400: cannot insert NULL into ("MOJ", "MD_PROJECTS"."ID") 에러 해결

쥬라기·2024년 12월 31일

oracle

목록 보기
1/4

들어가며

회사에서 "MySql" -> "Oracle"로 마이그레이션 하는 업무를 맡게 되었는데,
마이그레이션 자체도 처음이고, oracle도 처음 써보다보니, 마이그레이션 과정에서 꽤 많은 오류를 마주쳤다.
이 글을 시작으로 오라클을 사용하면서 생겼던 오류와 해결 방식, 그리고 알게된 오라클 정보 등을 정리해보고자 한다.

문제 상황

SQL DEVELOPER 에서 MYSQL -> ORACLE로 마이그레이션을 위해 모든 세팅을 하고, 완료를 눌렀을때, 다음 화면과 같은 에러가 발생했다.


ORA-01400: cannot insert NULL into ("MOJ", "MD_PROJECTS"."ID")

이 에러는 NULL이 허용되지 않는 필드에 null값을 삽입하려고 할 때 발생하는 오류인데,
나의 경우에는,, 내가 저 테이블을 만든 적도 없을뿐더러 null을 넣으려고 한 적도 없다.
단지 마이그레이션 시작하자마자 나온 오류일뿐 !__!

내 생각은
"MD_PROJECTS"의 경우에는 아마 마이그레이션 할 때 자동으로 생기는 테이블중 하나인 듯 하고,
위와 같은 에러가 생긴 이유는 null값을 넣으려고 한 행동(?)과 상관없이 사용자 권한이 제대로 설정되어있지 않아서,,, 발생한 오류가 아닐까 생각한다 (내가 이와 같이 생각한 이유는 해결방법과 관련있다.)

해결방법

위에 말했듯이, 사용자 권한과 관련된 문제라고 생각한 이유는
사용자에게 최고 권한인 DBA를 부여했을 때 해당 에러는 해결됐기때문이다.
즉, 마이그레이션을 할 스키마에게 sys사용자가 권한을 줘야한다.
GRANT DBA TO [스키마이름(유저이름)]; 로 주면 되는데,
반드시 마이그레이션을 시도하기 전, "MD_PROJECTS" 테이블이 생성되기 전에 미리 권한을 부여해줬어야한다.

그럼 왜 DBA 권한을 주면 해결이 될까?? 왜 문제가 발생했던 걸까??
그리고 DBA란 무엇일까에 대한 궁금증이 생겼다.

1. 왜 문제가 발생했을까?

  • ORA-01400: cannot insert NULL into ("MOJ", "MD_PROJECTS"."ID") 만약 id가 자동으로 증가하는 또는 생성되는 값이였다면 그리고 이에 대해 시퀀스와 트리거가 설정되어 있다면,
    해당 유저가 이 시퀀스나 트리거에 접근할 수 있는 권한이 없는 경우 시퀀스와 트리거가 작동하지 못하여 id값이 생성되지 못하고 이에 null값이 들어가려고 할것이다.
    또한, 테이블에 insert 또는 select하는 권한이 없어도 데이터를 넣는 과정에서 문제가 발생할 수도 있다.

따라서 이러한 권한을 유저가 가지고 있지 않아서 발생한 문제였던 것이다.

2. DBA란 무엇이고, 왜 해당 권한을 주면 해결이 될까 ?

  • DBA 권한은 database administrator 로 데이터베이스 관리자가 필요로하는 모든 데이터베이스 객체에 대한 접근과 작업 권한을 가지고 있다. 즉, 권한을 가지고 있는 유저는 본인 스키마뿐만 아니라 다른 스키마에 대해서도 관여할 수 있다.
  • 모든 객체에 대한 자유로운 접근이 가능하기에 시퀀스 및 트리거 작업도 가능해지고 이에 위 1번에서 문제되었던 id도 자동으로 생성되면서 해결 됐을 것이다.


❗️다만, dba 권한을 주면서 주의할 점은,
모든 권한을 설정해주는 것이므로, 해당 유저가 다른 유저의 스키마를 삭제한다던가 변경한다던가 하는 보안 및 데이터 무결성 문제를 발생시킬 수 있다.
그렇기에, DBA 권한이 아닌 시퀀스 또는 트리거를 생성하고 실행할 수 있는 최소한의 권한만 부여하는 것이 안전한 방법이다.
나는 로컬에서 테스트해본 것이라 dba 권한을 주는 것으로 끝났지만, 이후 실전에 적용할때에는 최소한의 권한만 주고 테스트해볼 예정이다..!!

🔅

결론은
GRANT DBA TO [스키마이름(유저이름)];
이런식으로 권한을 부여하면 오류는 해결된다!

profile
기록하고 분석하는 개발자

0개의 댓글