splunk에서 쿼리를 사용해서 RDBMS에 접근할 때에는 대부분 dbxquery를 사용한다. 하지만 간혹 dbxoutput 쿼리를 사용할 때가 있다. 그런데 맨 처음 dbxoutput을 사용할 때 이상한 점을 느낀다. 그냥 update, insert 쿼리를 사용해서 바로 업데이트를 하고싶은데, 그게 안된다.
dbxoutput을 사용할 때에는 DB-Connect app에 정의된 데이터베이스 출력
를 인수로 사용하게 되고, 이때 데이터베이스 출력 개체에 output하게 될 필드 정보를 저장한다.
이때 쿼리는 SQL이 아니라 SPL로 이뤄져야 한다. 그래서 처음에 이게 뭐지 싶었다. 난 그냥 update, insert쿼리를 사용한 SPL이 필요한데 그것은 Splunk에서 제공하지 않는다.
따라서 결론은 Splunk를 통해 Insert, update를 하려면
이다.
DB Connect app -> Data Lab -> Outputs -> New Output 클릭
| makeresults
| eval cityId=6, cityname="test", country_id=00, last_updated_date="2019-05-05 11:25:20"
현재 테이블이 이렇게 생겼다고 하면, 내가 업데이트 하고싶은 값을 makeresults를 이용해 임의로 만들어준다.
내가 업데이트 할 값을 테이블 필드와 매핑되게끔 만들어준다. 이렇게 임의의 결과를 만들고 이 결과의 필드 정보를 데이터베이스 출력 개체로 만드는 것 이다.
다음을 눌러서 연결하는 데이터 베이스와 테이블 정보를 클릭해준다.
내가 만든 쿼리의 컬럼 값이 실제 테이블 필드와 100% 일치할 수 없기 때문에 매핑 작업을 해준다.
이후, Upsert Configuration은 키 값이 일치할 경우 Insert가 아닌, update를 가능하게 하는지에 대한 부분이다.
나는 체크를 했고, city_id가 일치할 경우에는 insert가 아닌 update로 되게끔 했다.
dbxoutput에서 인수로 쓰일 출력 개체의 이름을 지정한다.
이후에는 파라미터 세팅을 한다.
나는 위의 그림과 같이 설정한 후에 완료했다.
다음과 같이, 앞서 만들어진 샘플 쿼리와 같은 필드로 이뤄져 있는 makeresults 쿼리를 만들었다.
이후에 dbxoutput 에 output 인수로 앞서 만든 개체의 이름을 써주면 된다.
| makeresults
| eval cityId=8, cityname="testtestetset", country_id=0230, last_updated_date="2019-05-05 11:25:20"
| dbxoutput output="test_db"
실제 DB에 들어가봐도 업데이트 된 모습을 확인할 수 있다.