독까의 이야기

1.  MS-SQL 2000 에서 2014 로 DB 이전 했는데 DML 정상 작동하지 않음

2.  MS 에서 안내한 바로는 SQL 2005 이상부터 아래와 같은 오류가 출력 된다고 함

 

오류 메시지 1

결과 창을 마지막으로 검색한 이후 데이터가 변경되었습니다. 지금 변경 내용을 저장하려면 하시겠습니까?
(낙관적 동시성 제어 오류)
그래도 데이터베이스 변경 내용을 커밋할 예 를 클릭하십시오.
변경 내용을 취소하고 이 행에 대한 현재 데이터를 검색하려면 아니요 를 클릭하십시오.
편집을 계속하려면 취소 [NULL]를 클릭하십시오.

참고예 이 오류 메시지 대화 상자에서 행은 제대로 업데이트됩니다.

오류 메시지 2

행이 업데이트되었습니다.
X 행에 데이터가 커밋되지 않았습니다.
오류 원본: Microsoft.VisualStudio.DataTools.
오류 메시지: 해당 행 값이 업데이트되거나 하나가 삭제된 행의 고유 만들지 마십시오 또는 여러 개의 행 (N 행) 변경합니다.
오류를 수정한 및 다시 시도 또는 해당 변경 내용을 취소하려면 Esc 키를 누릅니다.

참고 이 메시지 대화 상자가 나타나면 행을 업데이트할 수 없습니다.

다음 조건에 해당하면 이 문제가 발생합니다.

 * text 또는 ntext 데이터 형식의 열이 하나 이상의 테이블에 들어 있습니다.
 * 이러한 열 중 하나의 값을 다음 문자가 포함되어 있습니다.
 *
  * 백분율 기호 (%)
  * 밑줄 (_)
  * 왼쪽된 대괄호 ()

 * 테이블에 기본 키가 포함되어 있지 않습니다

 

3.  text 형식으로 구성된 열을 찾아서 varchar(max) 로 변경하고 DML 진행

4.  DML 정상 작동 확인

'Database > MS-SQL' 카테고리의 다른 글

현재 사용 중인 DB 중 제한 없는 DB 확인 쿼리  (0) 2016.07.25
DDL, DML, DCL  (0) 2016.07.25
DB 오프라인, 온라인  (0) 2016.07.25
DB 내의 특정 구문 일괄 삭제  (0) 2016.07.25
MS-SQL 모든 사용자 연결 끊기  (0) 2016.07.25

USE master

ALTER DATABASE DB명 SET OFFLINE



USE master
ALTER DATABASE DB명  SET ONLINE

'Database > MS-SQL' 카테고리의 다른 글

DDL, DML, DCL  (0) 2016.07.25
X 행에 데이터가 커밋되지 않았습니다.  (0) 2016.07.25
DB 내의 특정 구문 일괄 삭제  (0) 2016.07.25
MS-SQL 모든 사용자 연결 끊기  (0) 2016.07.25
php + MS-SQL 연동시 확인 사항  (0) 2016.07.22

SQL Injection 또는 외부 침입으로 인하여 DB 에 비정상 자료 등록되는 경우가 발생함

스팸게시글 등록 또는 광고 웹페이지 경로 등록 등 게시글 등록시 일괄 삭제 필요함

순서 1

프로시저 생성

CREATE PROCEDURE  [DB_DEL_TEXT]
AS

DECLARE @TP  int;
DECLARE @TBL varchar(255), @CLN varchar(255),  @DEL_STR varchar(255);
SET @DEL_STR='광고광고광고<script src=http://fuckingchina.com></script>'   -- 여기의 ' ' 안의 내용이 삭제 될 예정인 내용

DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name ,b.xtype
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR b.xtype = 35 OR b.xtype = 231 OR b.xtype = 167  OR b.xtype=175  OR b.xtype=239 );

OPEN Table_Cursor;

FETCH NEXT FROM Table_Cursor INTO @TBL, @CLN, @TP;
WHILE (@@FETCH_STATUS = 0) BEGIN
    IF  @TP  > 100
    BEGIN
          EXEC('UPDATE ['+ @TBL +'] set [' + @CLN + '] = REPLACE('+ @CLN+' , '''+@DEL_STR +''','''' )');
    END
    ELSE
    BEGIN
                    EXEC('UPDATE ['+ @TBL +'] set [' + @CLN + '] = REPLACE(CONVERT(varchar(8000),'+ @CLN+') , '''+@DEL_STR +''','''' )');
    END
FETCH NEXT FROM Table_Cursor INTO @TBL, @CLN,@TP;
END;

CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
GO

 

순서2

일괄 삭제를 진행 할 DB 접근하여 새 쿼리 실행 후 생성 된 프로시저 실행

Exec DB_DEL_TEXT