2016-07-01 5 views
-1

많은 테이블이있는 데이터베이스가 주어지면 여러 개의 delete 및 truncate 문이 채워진 스크립트가 있습니다. 내 데이터베이스에있는 각 테이블에 대해 delete 문이나 truncate 문이 없습니다. 스크립트는 다음 (나는 길이 이름을 변경하고 단축 한) 다음과 같습니다삭제 또는 truncate 문에 정의되지 않은 테이블에서 데이터가 제거되는 방식은 무엇입니까?

TRUNCATE table db.dbo.table1 
TRUNCATE table db.dbo.table2 
TRUNCATE table db.dbo.table3 

--cannot truncate table because it is being referenced by a FK constraint 
--TRUNCATE table db.dbo.table4 
--TRUNCATE table db.dbo.table5 
--TRUNCATE table db.dbo.table6 
--TRUNCATE table db.dbo.table7 

DELETE FROM db.dbo.table4 
DBCC CHECKIDENT ('db.dbo.table4',RESEED, 0) 
DELETE FROM db.dbo.table5 
DBCC CHECKIDENT ('db.dbo.table5',RESEED, 0) 
DELETE FROM db.dbo.table6 
DBCC CHECKIDENT ('db.dbo.table6',RESEED, 0) 
DELETE FROM db.dbo.table7 
DBCC CHECKIDENT ('db.dbo.table7',RESEED, 0) 
DELETE FROM db.dbo.table8 
DELETE FROM db.dbo.table9 
DELETE FROM db.dbo.table10 
DELETE FROM db.dbo.table11 
DELETE FROM db.dbo.table12 
DELETE FROM db.dbo.table13 
DELETE FROM db.dbo.table14 
DELETE FROM db.dbo.table15 

스크립트를 실행 한 후, 나는 그 데이터가 스크립트에 포함되지 않은 테이블에서 제거되고 발견하고있다.

데이터가있는 테이블을 확인하려면 SO 대답에서 찾은 here이라는 쿼리를 사용하고 있습니다.

SELECT 
    t.NAME AS TableName, 
    SUM(p.rows) AS [RowCount] 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
WHERE 
    i.index_id <= 1 
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    SUM(p.rows) DESC 

데이터베이스 백업이 있습니다. 다음으로는 :

  1. 데이터베이스
  2. 실행 '테이블 데이터'쿼리 복원 : 정말 삭제에 포함되지 않은 테이블에 존재하지 데이터를 재확인하기를/
  3. 을 스크립트를 절단/삭제 실행 스크립트를
  4. 을 절단
  5. '테이블 데이터'쿼리를 실행하십시오.

결과는 다음과 같습니다. 삭제/잘라 내기 스크립트에 정의되지 않은 테이블에서 데이터가 제거되고 있습니다.

내 질문 : 삭제 또는 truncate 문에서 정의되지 않은 테이블에서 데이터가 제거되는 방식으로 데이터베이스의 모든 테이블이 아닌 하나 이상의 테이블을 삭제하거나 자르는 경우를 생각해보십시오.

답변

-1

테이블에 참조 무결성 제한 연계 동작 값이 CASCADE 인 외래 키가 포함되어 있으면 삭제 또는 truncate 문에 정의되지 않은 테이블에서 데이터 행을 제거 할 수 있습니다.

here 다음 Microsoft 설명서가 도움이됨을 발견했습니다. 계단식 참조 무결성 제약 조건을 사용하여

캐스 케이 딩 참조 무결성
, 당신은 사용자가 삭제하거나 기존 외래 키가 가리키는 에 키를 업데이트하려고 할 때 데이터베이스 엔진이 소요되는 작업을 을 정의 할 수 있습니다. 다음 계단식 작업은 이 될 수 있습니다.
...
CASCADE
해당 행은 부모 테이블에서 해당 행이 업데이트되거나 삭제 될 때 참조 용 테이블에서 업데이트되거나 삭제됩니다. timestamp 열이 외래 키 또는 참조 된 키의 일부인 경우 CASCADE 을 지정할 수 없습니다. ON DELETE CASCADE는 INSTEAD OF DELETE 트리거가있는 테이블에 대해 으로 지정할 수 없습니다. ON UPDATE INSTEAD OF UPDATE 트리거가있는 테이블에 대해 CASCADE를 지정할 수 없습니다. 테이블은 데이터가 외부 키 계단식 참조 무결성 제약 조건이 어떤 액션 값이 삭제되는 경우
...

다음 체크 확인합니다.

방법 1 : 쿼리하십시오. 나는 대답을 here 찾을 수있는 제공되는 다음 쿼리를 사용하고 있습니다. 2016 Microsoft SQL Server 관리 Studio에서 개체 탐색기를 사용하여 :

SELECT name, delete_referential_action_desc 
FROM sys.foreign_keys 

방법 2

  1. 데이터 테이블 개체를
  2. 확장 '키를 확장
  3. 에서 삭제되고 있음을 테이블로 이동 '폴더
  4. 외부 키를 마우스 오른쪽 단추로 클릭하고 수정을 클릭하십시오.
  5. 를 확장하십시오. 나는 테이블, 데이터, Cascade의 값으로 참조 무결성 제약 조건을 계단식 외국 키가 삭제되고 있음을 발견

오른쪽 아래 윈도우 창에있는 91,섹션

  • Delete Rule 값을 식별합니다.

    또한 이것이 실제 원인인지 테스트했습니다. 값을 No Action으로 업데이트하고, 데이터베이스를 복원하고, 삭제/자르기 스크립트를 실행하고, '테이블 데이터'쿼리를 실행하고, 데이터가 지속되는 것을 발견했습니다.

  • +1

    그럼 직접 질문 하시겠습니까? 나는 downvoting하지 않습니다. –

    +0

    방아쇠가 삭제를 유발할 수 있다고 생각하면됩니다. –