[sql] ‘DF __ *’개체는 ‘*’열에 종속됩니다. int를 double로 변경
기본적으로 나는 다음 속성을 가진 EF 데이터베이스에 테이블을 얻었습니다.
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }
그러나 등급의 int를 double로 변경하면 데이터베이스를 업데이트 할 때 다음 오류가 발생합니다.
‘DF_ Movies _Rating__48CFD27E’ 개체 는 ‘Rating’열에 종속됩니다. ALTER TABLE ALTER COLUMN 하나 이상의 개체가이 열에 액세스하므로 평가에 실패했습니다.
무엇이 문제입니까?
답변
이 시도:
필드 유형을 변경하기 전에 DF_Movies_Rating__48CFD27E 제한 조건을 제거하십시오 .
제약 조건은 일반적으로 DBMS (SQL Server)에 의해 자동으로 생성됩니다.
테이블과 연관된 제한 조건을 보려면 아래에 표시된대로 오브젝트 탐색기 에서 테이블 속성을 펼치고 제한 조건 범주를 펼치 십시오.
필드 유형을 변경하기 전에 구속 조건을 제거해야합니다.
답변
이것이 tsql
방법입니다
ALTER TABLE yourtable DROP CONSTRAINT constraint_name -- DF_Movies_Rating__48CFD27E
완전성을 위해 @Joe Taras의 의견을 답변으로 표시합니다.
답변
제약 조건의 출처를 설명하는 응답으로 이것을 추가하고 있습니다. 나는 주석에서 그것을 시도했지만 멋지게 편집하기가 어렵다 :-/
기본값이있는 열이있는 테이블을 만들거나 변경하면 제약 조건이 만들어집니다.
예를 들어 테이블에서 다음과 같습니다.
CREATE TABLE Movie (
...
rating INT NOT NULL default 100
)
기본값 100에 대한 제약 조건을 만듭니다.
대신 그렇게 만들면
CREATE TABLE Movie (
name VARCHAR(255) NOT NULL,
rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100
);
그런 다음 해당 테이블을 변경할 때 참조하기 쉬운 멋진 이름의 제약 조건을 얻습니다.
ALTER TABLE Movie DROP CONSTRAINT rating_default;
ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL;
-- sets up a new default constraint with easy to remember name
ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;
마지막 두 문을 결합하여 열을 변경하고 제약 조건의 이름을 한 줄로 지정할 수 있습니다 (어쨌든 기존 테이블 인 경우해야합니다)
답변
제약 조건에 예측할 수없는 이름이 있으므로 이름 을 모른 채 특수 스크립트 ( DropConstraint )를 작성하여 제거 할 수 있습니다 (EF 6.1.3에서 테스트 됨).
public override void Up()
{
DropConstraint();
AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false));
}
private void DropConstraint()
{
Sql(@"DECLARE @var0 nvarchar(128)
SELECT @var0 = name
FROM sys.default_constraints
WHERE parent_object_id = object_id(N'dbo.MyTable')
AND col_name(parent_object_id, parent_column_id) = 'Rating';
IF @var0 IS NOT NULL
EXECUTE('ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [' + @var0 + ']')");
}
public override void Down()
{
AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false));
}
답변
MS SQL Studio는 열을 삭제할 때 처리하지만 프로그래밍 방식으로 제약 조건 을 삭제 해야하는 경우 간단한 해결책이 있습니다.
다음은 기본 제약 조건으로 열을 삭제하는 코드 스 니펫입니다.
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND name='__ColumnName__')
EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__')
TableName 과 ColumnName 을 적절한 값으로 바꾸십시오 . 열이 이미 삭제 된 경우에도이를 안전하게 실행할 수 있습니다.
보너스 : 외래 키 및 기타 유형의 제약 조건을 삭제하는 코드는 다음과 같습니다.
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__')
BEGIN
SELECT @ConstraintName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__'
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
END
답변
의존하는 열을 삭제하려고하면 다음과 같은 오류가 발생합니다.
‘DF __ *’개체는 ”열에 종속됩니다.
해당 열에 의존하는 제약 조건을 다음과 같이 삭제하십시오.
ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;
예:
메시지 5074, 수준 16, 상태 1, 줄 1
‘ DF__Employees__Colf__1273C1CD’ 오브젝트는 ‘ Colf’ 열에 종속됩니다.
메시지 4922, 수준 16, 상태 9, 줄 1
ALTER TABLE DROP COLUMN 하나 이상의 개체가이 열에 액세스하므로 Colf가 실패했습니다.
구속 조건 삭제 (DF__Employees__Colf__1273C1CD) :
ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;
그런 다음 열을 삭제할 수 있습니다.
Alter Table TableName Drop column ColumnName