하나 이상의 개체가 이 열에 액세스하기 때문에 ALTERTABLE Drop COLUMN이 실패했습니다.
이 작업을 수행하려고 합니다.
ALTER TABLE CompanyTransactions DROP COLUMN Created
하지만 이해합니다.
Msg 5074, Level 16, State 1, Line 2 객체 'DF__CompanyTr__Create_0CDAE408'은 'Created' 열에 종속됩니다.하나 이상의 개체가 이 열에 액세스하기 때문에 Msg 4922, Level 16, State 9, Line 2 ALTER TABLE Drop COLUMN을 생성하지 못했습니다.
이것은 코드 첫 번째 표입니다.어찌된 일인지 마이그레이션이 모두 엉망이 되어 변경된 내용을 수동으로 롤백하려고 합니다.
이게 뭔지 전혀 모르겠어요.
DF__CompanyTr__Creat__0CDAE408
다음을 제거해야 합니다.constraints열을 제거하기 전에 열에서 제거합니다.참조하는 이름은 다음과 같습니다.default constraint.
예.
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
@SqlZim의 대답은 정확하지만 왜 이런 일이 발생했는지 설명하기 위한 것입니다.저도 비슷한 문제가 있었는데 아주 순수한 것 때문에 발생했습니다. 열에 기본값을 추가하는 것입니다.
ALTER TABLE MySchema.MyTable ADD
MyColumn int DEFAULT NULL;
그러나 MS SQL Server 영역에서 열의 기본값은 CONSTARINT입니다. 모든 제약 조건과 마찬가지로 이 열에도 식별자가 있습니다.또한 열이 제약 조건에 사용되는 경우 열을 삭제할 수 없습니다.
따라서 이러한 문제를 방지할 수 있는 방법은 항상 기본 제약 조건에 명시적인 이름을 지정하는 것입니다. 예를 들어 다음과 같습니다.
ALTER TABLE MySchema.MyTable ADD
MyColumn int NULL,
CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;
열을 삭제하기 전에 구속조건을 삭제해야 하지만 적어도 앞에 있는 이름은 알고 있어야 합니다.
답변에 이미 쓰여 있듯이 삭제하려는 모든 열과 관련된 제약 조건(sql에 의해 자동으로 생성됨)을 삭제해야 합니다.
다음 단계를 수행하여 필요한 작업을 수행합니다.
- 시스템 저장 프로시저 유틸리티인 sp_helpconstraint를 사용하여 모든 제약 조건의 이름 가져오기 - 다음을 실행합니다.
exec sp_helpconstraint '<your table name>' - 제약 조건의 이름을 얻으면 해당 제약 조건 이름을 복사하고 다음 문을 실행합니다.
alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1>(이 형식과 유사하거나 이와 유사한 형식이 될 것입니다. - 제약 조건을 삭제한 후 기존 방법을 사용하여 하나 이상의 열을 삭제할 수 있습니다.
Alter table <YourTableName> Drop column column1, column2기타
열을 변경할 때datatype당신은 바꿀 필요가 있습니다.constraint key모든 데이터베이스에 대해
alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
몇 가지 작업을 수행해야 합니다.
- 먼저 정보 스키마에서 제약 조건이 있는지 확인해야 합니다.
- 그런 다음 sys.default_constraints 및 sys.constraints를 결합하여 열과 default_constraints가 동일한 개체 ID를 가지고 있는지 쿼리해야 합니다.
- 2단계에 참여하면 default_constraints에서 제약 조건 이름을 얻을 수 있습니다.그런 제약을 없애면 됩니다.여기 제가 한 그런 방울의 예가 있습니다.
-- 1. Remove constraint and drop column
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TABLE_NAME'
AND COLUMN_NAME = N'LOWER_LIMIT')
BEGIN
DECLARE @sql NVARCHAR(MAX)
WHILE 1=1
BEGIN
SELECT TOP 1 @sql = N'alter table [TABLE_NAME] drop constraint ['+dc.name+N']'
FROM sys.default_constraints dc
JOIN sys.columns c
ON c.default_object_id = dc.object_id
WHERE dc.parent_object_id = OBJECT_ID('[TABLE_NAME]') AND c.name = N'LOWER_LIMIT'
IF @@ROWCOUNT = 0
BEGIN
PRINT 'DELETED Constraint on column LOWER_LIMIT'
BREAK
END
EXEC (@sql)
END;
ALTER TABLE TABLE_NAME DROP COLUMN LOWER_LIMIT;
PRINT 'DELETED column LOWER_LIMIT'
END
ELSE
PRINT 'Column LOWER_LIMIT does not exist'
GO
승인된 답변 외에도 데이터베이스 업데이트에 엔티티 마이그레이션을 사용하는 경우 다음 행을 시작할 때 추가해야 합니다.Up()마이그레이션 파일의 기능:
Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");
에서 하는 오류에서 제약 조건 이름을 찾을 수 .FK_dbo.
저도 같은 문제가 있었는데, 이 스크립트는 마침표로 구분된 두 개의 부품 이름을 가진 테이블에서 작동했습니다.
[DATABASENAME] GO ALTER TABLE [TableNamePart1]을 사용합니다.[표명2부] DROP 제약 [DF__표명1D__칼럼명__5AEE82B9] GO ALTER TABLE [TableNamePart1]으로 이동합니다.[표명 Part1] Drop COLUMN [칼럼명] GO
INT 기본 키를 GUID로 교체해야 했습니다.몇 번의 실패 후 아래의 EF 코드가 저에게 효과가 되었습니다.기본값을 hyst로 설정하면...하나의 가이드로 기존 레코드의 키를 지정할 수 있습니다.
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropUniqueConstraint("PK_Payments", "Payments");
migrationBuilder.DropColumn(
name: "PaymentId",
table: "Payments");
migrationBuilder.AddColumn<Guid>(
name: "PaymentId",
table: "Payments",
type: "uniqueidentifier",
defaultValueSql: "NewId()",
nullable: false);
}
오류 메시지에서 기본 제약 조건 이름을 복사하고 삭제할 열과 동일한 방법으로 입력합니다.
동일한 문제가 있었습니다. 마이그레이션을 제거할 수 없습니다. 이미 적용된 항목이 있다는 오류가 표시되어 앱 설정에서 DB 이름을 변경하고 모든 마이그레이션을 제거한 다음 새 마이그레이션을 추가하면 작동했습니다.문제를 완전히 이해하지는 못했지만 효과가 있었습니다.
마이그레이션 내부에 삭제 제약 조건을 추가하여 수정했습니다.
migrationBuilder.DropForeignKey(
name: "FK_XX",
table: "TableX").
아래는 제약 조건을 재현합니다.
migrationBuilder.AddForeignKey(
name: "FK_XX",
table: "TableX",
column: "ColumnX",
onDelete: ReferentialAction.Restrict);
언급URL : https://stackoverflow.com/questions/43549413/alter-table-drop-column-failed-because-one-or-more-objects-access-this-column
'programing' 카테고리의 다른 글
| Azure 파이프라인에서 현재 작업 디렉토리 변경 (0) | 2023.04.27 |
|---|---|
| 터미널 창에서 리눅스로 파일을 만드는 방법은 무엇입니까? (0) | 2023.04.27 |
| 이클립스 코드 라인 수 (0) | 2023.04.27 |
| 데이터를 덮어쓰지 않고 기존 Excel 파일에 쓰는 방법(팬더 사용) (0) | 2023.04.27 |
| 현재 작업 디렉토리가 아닌 파일 위치에 기반한 상대 경로 (0) | 2023.04.22 |