2011-08-23 3 views
0

특정 쿼리로 DB 상태가 변경 될 것이라고 어떻게 결정할 수 있습니까? JDBC를 사용합니다. INSERT, DELETE와 같은 핵심 단어를 파싱하는 구문 분석을 사용해야합니까? 아니면 다른 방법이 있습니까?쿼리가 변경 될지 여부 결정 DB

+0

진술이 데이터베이스를 변경할 수있는 것이거나 실제로 어떤 것이 변경 될지 알고 싶다면 신경 써야합니까? –

+0

첫 번째 경우. 나는 그것을 막고 싶다. – damluar

+0

왜 그 점을 알고 싶습니까? 최종 사용자가 직접 SQL 쿼리를 입력 할 계획입니까? –

답변

1

한 가지 방법 :

  • Execute the query
    1. 이 확인 update count
    2. 업데이트가 이루어질 경우, 사용자 체크 긍정적 인 반응에
    3. , commit 트랜잭션을한다. 음수 인 경우 roll it back

    변형이있을 수 있습니다. 귀하의 선택에 대한 느낌을 얻으려면 Statement API을 방문하십시오.

    편집 :autocommit이 꺼져 있거나 거래가 창 밖을 벗어나지 않도록하십시오!

    추가 편집 : 의견 작성자가 지적한대로 확장 가능한 솔루션은 아닙니다. 확장 성을 위해 트랜잭션을 짧게 유지해야하며 열린 트랜잭션 중에 사용자가 생각할 시간을 가지기를 원하지 않습니다.여러 명의 사용자가있을 경우 트랜잭션을 열어 두지 않는 방법을 찾으십시오. 아마도 문 캐싱과 롤백/커밋을 창의적으로 사용해야 할 것입니다. 더 나은 조언을 원하면 요구 사항에 대해 자세히 설명하십시오.

  • +0

    예, 좋은 대안입니다. 두 번 고마워요. – damluar

    +0

    흠. 사용자가 해킹 할 수 있기 때문에 여전히 좋은 해결책은 아닙니다. SET autocommit = 1; ..... 그래서 이것은 정말로 안전하지 않습니다. 네가하는 일까지 너에게 달려있어. 또한 데이터베이스에 대한 다른 모든 변경 사항은'commit'까지 보류 상태이기 때문에 잘못 수행됩니다. –

    +0

    사용자가 임의의 쿼리를 실행할 수 있다면 그렇습니다. 그렇다고 생각하지 않습니다. 그렇지 않으면 그는 데이터베이스 브라우저를 작성하고있는 것입니다. 동시 사용에 따라 성능이 문제가 될 수 있습니다. 나는 그걸 생각하지 않았다. –

    3

    쿼리를 확인하지 마십시오. 대신 데이터베이스를 수정할 수없는 사용자 자격 증명에서 쿼리가 실행되는지 확인하십시오. 여러 명의 사용자를 생성하고 각각의 제한된 권한을 부여 할 수 있습니다. 이 응용 프로그램은 데이터 만 선택할 수있는 사용자를 사용하여 연결해야합니다.

    정확한 방법 (그리고 이것이 가능하다면)은 사용하는 데이터베이스에 따라 다르지만 모든 현대 DBMS가이를 지원한다고 생각합니다.

    사용자가 권한이 충분하지 않을 때 얻을 수있는 예외를 catch하고 확인 후 다른 사용자를 사용하여 연결할 수 있습니다. 이렇게하면 쿼리를 파싱하는 것보다 훨씬 안전하고 오류가 발생하지 않는 데이터베이스 및 권한 관리에 모든 권한을 남겨 둡니다.

    +0

    나는 내가 물었던 것을 물었다. 고마워, 나는 다른 역할에 대해 알고 그들에게 사용자를 할당. 그러나 그것은 문제가 아닙니다. – damluar

    +0

    귀하의 질문에 대답하는 것이 아니라 귀하의 문제에 대한 해결책을 제공 할 것이라고 생각했습니다. 도움이 될만한 약간의 추가 기능을 만들었지 만 쿼리를 직접 구문 분석하는 경우 계속하십시오. 하지만이 일을 제대로 수행하려면 SQL에 대한 지식이 필요합니다. select 쿼리가 반드시 select로 시작하는 것은 아니며, delete 및 insert 문에는 select도 포함될 수 있습니다. 그리고 그것들은 단지 일반적인 예외 일뿐입니다 ... – GolezTrol

    +0

    고맙습니다, 나는 유일한 방법은 파싱이라고 생각합니다. 하지만 그렇지 않길 바랬습니다. – damluar

    0

    은 내가 JDBC 전문가는 아니지만이 봤다 당신에게 도움이 될 수 :

    http://www.techfeed.net/blog/index.cfm/2006/4/20/Obtaining-Affected-rows-from-SQL-Query

    그것은/UPDATE/DELETE INSERT에 의해 영향을받는 행의 수를 검색하기위한 몇 가지 방법을 제공합니다 진술. 물론 CREATE/DROP TABLE 등은별로 도움이되지 않습니다.하지만 시작일뿐입니다.

    +0

    아, 그냥 실행하기 전에 * 명령문을 가로 채기를 원한다는 것을 알았습니다. 그럼, 신경 쓰지 마라. (이것들은 실행 후에 작동합니다). –

    2

    MySQL 권한으로이 작업을하는 것이 좋습니다. 읽기 전용 액세스와 읽기/쓰기 권한을 가진 두 명의 사용자가 있어야합니다.

    1. 는 SQLException의 읽기 전용 사용자와
    2. 확인 쿼리를 실행하고 하나가 던져진다면 그들은 정말
    3. 그런 다음 두 번째 사용자를 사용하여 작성하려는 경우 다음 메시지를 표시합니다.

    이것은 데이터베이스에 대한 사용 권한을 밀어 넣기 때문에 가장 안전한 방법이라고 생각합니다. 그렇지 않으면 복잡한 SQL 구문 분석기를 사용해야합니다.

    1

    에 따라 다릅니다. UPDATE 또는 DELETE일 수도 있습니다. DB를 변경하십시오. 을 알고 싶다면 데이터베이스를 변경 하시겠습니까? INSERT, UPDATE, DELETE 또는 ALTER 키워드에 대/소문자를 구분하지 않는 검색은 데이터베이스를 변경하는 쿼리의 가능성을 알려줍니다. SELECT * FROM sometable WHERE something = 'update'과 같은 것을 막을 수는 없지만 조심하십시오.

    당신은 변화가 실제로 쿼리를 실행하기 전에, 을 할 것인지 여부를 을 알고 싶다면

    , 당신은 이미 데이터베이스에있는 데이터에 대해 뭔가를 알고있는 것입니다. SELECT 같은 WHERE 절을 잠재적 데이터 변경 문자 UPDATE 또는 DELETE 문으로 사용하고 데이터를 비교하십시오 (예 : JOIN 또는 SQL의 다른 고급 기능을 사용하는 쿼리의 경우 지저분해질 수 있음). 더 쉬운 방법은 use transactions으로 변경하고 변경 사항을 확인한 다음 트랜잭션을 롤백하여 변경 사항을 취소 할 수 있습니다.

    을 변경하려면 변경을 방지하려면 DBMS의 역할 관리를 사용해야하며 이러한 쿼리를 실행하는 사용자 또는 역할에 변경 쿼리를 실행할 수있는 권한을 부여하지 않는 것이 좋습니다.

    +0

    감사합니다. 좋은 생각 – damluar