Không thể giải quyết xung đột đối chiếu giữa các SQL SQL_Latin1_General_CP1_CI_AS và và Latin Latin1_General_CI_AS Nghi trong hoạt động tương đương


341

Tôi có đoạn mã sau

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

Khi chạy mã, tôi nhận được lỗi dán vào tiêu đề sau khi thêm hai phép nối cho bảng C. Tôi nghĩ rằng điều này có thể có liên quan đến thực tế là tôi đang sử dụng SQL Server 2008 và đã khôi phục bản sao của db này vào Máy của tôi năm 2005.

Câu trả lời:


306

Bạn có một sự không phù hợp của hai đối chiếu khác nhau trong bảng của bạn. Bạn có thể kiểm tra các đối chiếu mỗi cột trong (các) bảng của bạn bằng cách sử dụng truy vấn này:

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

Bộ sưu tập là cần thiết và được sử dụng khi đặt hàng và so sánh chuỗi. Nói chung, nên có một đối chiếu duy nhất, duy nhất được sử dụng trong toàn bộ cơ sở dữ liệu của bạn - không sử dụng các đối chiếu khác nhau trong một bảng hoặc cơ sở dữ liệu - bạn chỉ yêu cầu sự cố ....

Khi bạn đã giải quyết một đối chiếu duy nhất, bạn có thể thay đổi các bảng / cột chưa khớp với lệnh này:

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

Marc

CẬP NHẬT: để tìm các chỉ mục fulltext trong cơ sở dữ liệu của bạn, sử dụng truy vấn này tại đây:

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

Sau đó, bạn có thể thả chỉ mục fulltext bằng cách sử dụng:

DROP FULLTEXT INDEX ON (tablename)

Cảm ơn marc đó chính xác là loại điều tôi đang tìm kiếm, một trong những bảng là đối chiếu khác nhau vì một lý do ngu ngốc! Tôi sẽ thử thay đổi thành đối chiếu tiêu chuẩn và xem điều gì sẽ xảy ra.
jhowe

marc tôi đang nhận được điều này ngay bây giờ: Không thể thay đổi hoặc thả cột vì nó được bật cho Tìm kiếm toàn văn bản.
jhowe

1
Trong trường hợp đó, bạn sẽ cần tạm thời bỏ chỉ mục toàn văn bản của mình trên bảng đó, thay đổi đối chiếu và sau đó tạo lại chỉ mục toàn văn bản một lần nữa
marc_s

1
Cảm ơn OP, tôi đã thiết lập một bảng tạm thời để điều này có ích, nhưng vì tôi không thể thay đổi bảng, tôi cần chỉ cần khai báo chính xác để bắt đầu bằng (như sau): DECLARE @Table TABLE (So sánh so sánh VARCHAR (50) THU THẬP SQL_Latin1_General_CP1_CI_AS KHÔNG NULL)
FrostbiteXIII

1
Tại sao chúng ta không thể có 2 đối chiếu khác nhau trên cùng một bảng. Nếu tôi có 1 cột là nvarchar, chỉ cần tên tiếng Anh và cột khác là chữ cái tiếng Nga, cột khác là chữ cái tiếng Nhật. Làm thế nào để tôi sắp xếp này? Có một đối chiếu duy nhất bao gồm tất cả những điều này?
batmaci

854

Tôi làm như sau:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

Hoạt động mọi lúc. :)


68
Đây là một trong những bài viết hữu ích nhất trên SO
Jamie Strauss

2
Đã sử dụng giải pháp này vì tôi đã làm việc với hai hệ thống cũ sử dụng cùng một db nên tôi không chắc việc thay đổi đối chiếu các bảng có phá vỡ chức năng hay không.
paolobueno

5
Nếu hai trường giống nhau được sử dụng cùng nhau ở những nơi khác (so sánh, kết hợp, kết hợp, v.v.), hãy đảm bảo rằng mỗi trường cũng có đối chiếu được chỉ định.
Zarepheth

5
Điều này là vô cùng hữu ích. Tôi đang sử dụng một cơ sở dữ liệu cục bộ và truy vấn một máy chủ được liên kết và chúng có hai đối chiếu khác nhau. Rõ ràng tôi không thể thay đổi đối chiếu trên máy chủ được liên kết và tôi không muốn thay đổi cục bộ của mình, vì vậy đây hoàn toàn là câu trả lời tốt nhất.
jtate

7
@ppumkin Mặc dù đó là một giải pháp tuyệt vời, nó vẫn chỉ tránh được vấn đề, thay vì giải quyết nó. Trừ khi bạn muốn thay đổi đối chiếu cho mỗi truy vấn, điều này tẻ nhạt và không thực hiện tối ưu. Trong khi đó là một câu trả lời tuyệt vời, câu trả lời được chấp nhận mà tôi cảm thấy là câu trả lời tốt hơn.
Cướp

80

Sử dụng collatemệnh đề trong truy vấn của bạn:

LEFT JOIN C tO_C on tA.FieldName = 'CID' AND tA.oldValue COLLATE Latin1_General_CI_AS = tO_C.Name  

Tôi có thể không có cú pháp chính xác (kiểm tra BOL), nhưng bạn có thể làm điều này để thay đổi đối chiếu nhanh chóng cho truy vấn - bạn có thể cần thêm mệnh đề cho mỗi lần tham gia.

chỉnh sửa: Tôi nhận ra điều này không hoàn toàn đúng - mệnh đề đối chiếu đi sau trường bạn cần thay đổi - trong ví dụ này tôi đã thay đổi đối chiếu trên tA.oldValuetrường.


29

Xác định các trường mà nó gây ra lỗi này và thêm vào sau chúng: THU THẬP DATABASE_DEFAULT

Có hai bảng được nối trên trường Mã:

...
and table1.Code = table2.Code
...

Cập nhật truy vấn của bạn thành:

...
and table1.Code COLLATE DATABASE_DEFAULT = table2.Code COLLATE DATABASE_DEFAULT
...

Cảm ơn. Khi làm việc trong cơ sở dữ liệu prod, chúng tôi không thể luôn thay đổi cấu trúc cơ sở dữ liệu theo đề xuất của câu trả lời được chấp nhận.
Jennifer Wood

20

Điều này có thể dễ dàng xảy ra khi bạn có 2 cơ sở dữ liệu khác nhau và đặc biệt là 2 cơ sở dữ liệu khác nhau từ 2 máy chủ khác nhau. Tùy chọn tốt nhất là thay đổi nó thành một bộ sưu tập chung và thực hiện nối hoặc so sánh.

SELECT 
   *
FROM sd
INNER JOIN pd ON sd.SCaseflowID COLLATE Latin1_General_CS_AS = pd.PDebt_code COLLATE Latin1_General_CS_AS

13

@Valkyrie câu trả lời tuyệt vời. Tôi nghĩ rằng tôi đã đưa vào đây một trường hợp khi thực hiện tương tự với một truy vấn con bên trong một thủ tục được lưu trữ, vì tôi tự hỏi liệu câu trả lời của bạn có hoạt động trong trường hợp này không, và nó đã làm rất tuyệt.

...WHERE fieldname COLLATE DATABASE_DEFAULT in (
          SELECT DISTINCT otherfieldname COLLATE DATABASE_DEFAULT
          FROM ...
          WHERE ...
        )

12

Trong đó tiêu chí thêm collate SQL_Latin1_General_CP1_CI_AS

Điều này làm việc cho tôi.

WHERE U.Fullname = @SearchTerm  collate SQL_Latin1_General_CP1_CI_AS

6

Nguyên nhân sâu xa là cơ sở dữ liệu máy chủ sql mà bạn đã lấy lược đồ có một đối chiếu khác với cài đặt cục bộ của bạn. Nếu bạn không muốn lo lắng về việc đối chiếu, hãy cài đặt lại SQL Server cục bộ bằng cách sử dụng đối chiếu giống như cơ sở dữ liệu SQL Server 2008.


Có cùng một vấn đề, trước tiên bạn cần kiểm tra thuộc tính máy chủ và cơ sở dữ liệu của mình để xem chúng có cùng đối chiếu không
madan

5

lỗi (Không thể giải quyết xung đột đối chiếu giữa ....) thường xảy ra trong khi so sánh dữ liệu từ nhiều cơ sở dữ liệu.

vì hiện tại bạn không thể thay đổi đối chiếu cơ sở dữ liệu, hãy sử dụng THU THẬP DATABASE_DEFAULT.

----------
AND db1.tbl1.fiel1 COLLATE DATABASE_DEFAULT =db2.tbl2.field2 COLLATE DATABASE_DEFAULT 

điều này không khác với một câu trả lời đã được đưa ra: stackoverflow.com/a/1607725/479251
Pac0

4

Tôi đã có một cái gì đó như thế này trước đây và những gì chúng tôi tìm thấy là sự đối chiếu giữa 2 bảng là khác nhau.

Kiểm tra xem những cái này là như nhau.


4

Nhờ câu trả lời của marc_s, tôi đã giải quyết được vấn đề ban đầu của mình - được truyền cảm hứng để tiến thêm một bước và đăng một cách tiếp cận để chuyển đổi toàn bộ bảng tại một thời điểm - tập lệnh tsql để tạo các câu lệnh thay đổi cột:

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'affiliate'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)

được: ALTER TABLE Affiliate ALTER COLUMN myTable NVARCHAR (4000) THU LẬP Latin1_General_CI_AS KHÔNG NULL

Tôi sẽ thừa nhận bị bối rối bởi sự cần thiết phải col.max_length / 2 -


Tôi nghĩ rằng việc chia cho hai là bắt buộc vì độ dài được lưu trữ dưới dạng số byte bên trong. Nvarchar mất hai byte cho mỗi ký tự thay vì một byte như varchar.
Zebi

Công việc tuyệt vời, bao giờ vượt quá số lượng truy vấn cho các loại dữ liệu ncha có thể là do col.max_length / 2 -
Imran

2

Đối với những người có tập lệnh CREATE DATABASE (như trường hợp của tôi) cho cơ sở dữ liệu gây ra sự cố này, bạn có thể sử dụng tập lệnh CREATE sau để khớp với đối chiếu:

-- Create Case Sensitive Database
CREATE DATABASE CaseSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CS_AS -- or any collation you require
GO
USE CaseSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

hoặc là

-- Create Case In-Sensitive Database
CREATE DATABASE CaseInSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS -- or any collation you require
GO
USE CaseInSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

Điều này áp dụng đối chiếu mong muốn cho tất cả các bảng, đó là những gì tôi cần. Đó là lý tưởng để thử và giữ cho đối chiếu giống nhau cho tất cả các cơ sở dữ liệu trên một máy chủ. Hi vọng điêu nay co ich.

Thông tin thêm về liên kết sau: SQL SERVER - Tạo cơ sở dữ liệu với đối chiếu khác nhau trên máy chủ


2

Tôi đã sử dụng nội dung từ trang web này để tạo tập lệnh sau đây thay đổi đối chiếu tất cả các cột trong tất cả các bảng:

CREATE PROCEDURE [dbo].[sz_pipeline001_collation] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name + 
    CASE systypes.NAME
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE SYSCOLUMNS.length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,SYSCOLUMNS.length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
    WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
    AND SYSOBJECTS.TYPE = 'U'
    AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
    AND SYSCOLUMNS.COLLATION IS NOT NULL
    AND NOT ( sysobjects.NAME LIKE 'sys%' )
    AND NOT ( SYSTYPES.name LIKE 'sys%' )

END

1
SYSCOLUMNS.length của các cột nvarchar phải được chia cho 2
palota

2

Kiểm tra mức độ đối chiếu không khớp (máy chủ, cơ sở dữ liệu, bảng, cột, ký tự).

Nếu đó là máy chủ, các bước này đã giúp tôi một lần:

  1. Dừng máy chủ
  2. Tìm công cụ sqlservr.exe của bạn
  3. Chạy lệnh này:

    sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"

  4. Bắt đầu máy chủ sql của bạn:

    net start name_of_instance

  5. Kiểm tra đối chiếu máy chủ của bạn một lần nữa.

Đây là thông tin thêm:

https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/


2

Nếu điều này xảy ra trên toàn bộ DB của bạn thì tốt hơn là thay đổi đối chiếu DB của bạn như vậy:

USE master;  
GO  
ALTER DATABASE MyOptionsTest  
COLLATE << INSERT COLATION REQUIRED >> ;  
GO  

--Verify the collation setting.  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'<< INSERT DATABASE NAME >>';  
GO 

Tham khảo tại đây


Thật không may, điều này sẽ không thay đổi đối chiếu cho các bảng hiện có, mà chỉ mặc định cho các bảng mới
RockScience

2

Đã thêm mã vào câu trả lời của @ JustSteve để xử lý các cột varchar và varchar (MAX):

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'first_notes'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
            WHEN 167
            THEN ' varchar(' + CASE col.max_length 
                                WHEN -1 
                                THEN 'MAX'
                                ELSE 
                                CAST(col.max_length AS VARCHAR)
                                end
                                 + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)

2

Để giải quyết vấn đề này trong truy vấn mà không thay đổi cơ sở dữ liệu, bạn có thể truyền biểu thức ở phía bên kia của dấu "=" bằng

COLLATE SQL_Latin1_General_CP1_CI_AS

như đề nghị ở đây .


1

Tôi đã gặp một lỗi tương tự (Không thể giải quyết xung đột đối chiếu giữa "SQL_Latin1_General_CP1_CI_AS" và "SQL_Latin1_General_CP1250_CI_AS" trong hoạt động INTERSECT), khi tôi sử dụng trình điều khiển jdbc cũ.

Tôi đã giải quyết điều này bằng cách tải xuống trình điều khiển mới từ Microsoft hoặc jTDS dự án nguồn mở .


1

Đây là những gì chúng tôi đã làm, trong tình huống của chúng tôi, chúng tôi cần một truy vấn đặc biệt được thực hiện bằng cách sử dụng một hạn chế ngày theo yêu cầu và truy vấn được xác định trong một bảng.

Truy vấn mới của chúng tôi cần khớp dữ liệu giữa các cơ sở dữ liệu khác nhau và bao gồm dữ liệu từ cả hai cơ sở dữ liệu.

Có vẻ như THU THẬP khác nhau giữa db nhập dữ liệu từ hệ thống iSeries / AS400 và cơ sở dữ liệu báo cáo của chúng tôi - điều này có thể là do các loại dữ liệu cụ thể (chẳng hạn như dấu Hy Lạp trên tên, v.v.).

Vì vậy, chúng tôi đã sử dụng mệnh đề tham gia dưới đây:

...LEFT Outer join ImportDB..C4CTP C4 on C4.C4CTP COLLATE Latin1_General_CS_AS=CUS_Type COLLATE Latin1_General_CS_AS

1

Bạn có thể dễ dàng làm điều này bằng cách sử dụng 4 bước đơn giản

  1. sao lưu cơ sở dữ liệu của bạn, chỉ cần incase
  2. thay đổi đối chiếu cơ sở dữ liệu: nhấp chuột phải vào cơ sở dữ liệu, chọn thuộc tính, đi đến các tùy chọn và thay đổi đối chiếu thành đối chiếu yêu cầu.
  3. Tạo tập lệnh để Thả và Tái tạo tất cả các đối tượng cơ sở dữ liệu của bạn: nhấp chuột phải vào cơ sở dữ liệu của bạn, chọn tác vụ, chọn tạo tập lệnh ... (đảm bảo bạn chọn Thả & Tạo trên các tùy chọn Nâng cao của Trình hướng dẫn, Đồng thời chọn Lược đồ & Dữ liệu)
  4. Chạy Script được tạo ở trên

1
INSERT INTO eSSLSmartOfficeSource2.[dbo].DeviceLogs  (DeviceId,UserId,LogDate,UpdateFlag) 
SELECT DL1.DeviceId ,DL1.UserId COLLATE DATABASE_DEFAULT,DL1.LogDate 
,0 FROM eSSLSmartOffice.[dbo].DeviceLogs DL1 
WHERE  NOT EXISTS 
(SELECT DL2.DeviceId ,DL2.UserId COLLATE DATABASE_DEFAULT
,DL2.LogDate ,DL2.UpdateFlag 
FROM eSSLSmartOfficeSource2.[dbo].DeviceLogs DL2    
WHERE  DL1.DeviceId =DL2.DeviceId
 and DL1.UserId collate  Latin1_General_CS_AS=DL2.UserId collate  Latin1_General_CS_AS
  and DL1.LogDate =DL2.LogDate )

0

Bạn có thể không có bất kỳ vấn đề đối chiếu nào trong cơ sở dữ liệu của mình, nhưng nếu bạn khôi phục bản sao cơ sở dữ liệu của mình từ bản sao lưu trên máy chủ có đối chiếu khác với nguồn gốc và mã của bạn đang tạo các bảng tạm thời, các bảng tạm thời đó sẽ kế thừa đối chiếu từ máy chủ và sẽ có xung đột với cơ sở dữ liệu của bạn.


0
ALTER DATABASE test2            --put your database name here
COLLATE Latin1_General_CS_AS    --replace with the collation you need

0

Tôi đã có một yêu cầu tương tự; ghi lại cách tiếp cận của tôi ở đây cho bất cứ ai có kịch bản tương tự ...

Kịch bản

  • Tôi có một cơ sở dữ liệu từ một cài đặt sạch với các đối chiếu chính xác.
  • Tôi có một cơ sở dữ liệu khác có các đối chiếu sai.
  • Tôi cần cập nhật cái sau để sử dụng các collations được xác định trên cái trước.

Giải pháp

Sử dụng So sánh lược đồ máy chủ SQL (từ Công cụ dữ liệu SQL Server / Visual Studio) để so sánh nguồn (cài đặt sạch) với đích (db với đối chiếu không hợp lệ).

Trong trường hợp của tôi, tôi đã so sánh trực tiếp hai DB; mặc dù bạn có thể làm việc thông qua một dự án để cho phép bạn điều chỉnh thủ công các phần ở giữa ...

  • Chạy Visual Studio
  • Tạo một dự án dữ liệu máy chủ SQL mới
  • Nhấp vào Công cụ, Máy chủ SQL, So sánh lược đồ mới
  • Chọn cơ sở dữ liệu nguồn
  • Chọn cơ sở dữ liệu đích
  • Bấm tùy chọn (⚙)
    • Trong phần Object Typeschỉ chọn những loại bạn quan tâm (đối với tôi nó chỉ ViewsTables)
    • Theo Generallựa chọn:
      • Chặn mất dữ liệu có thể
      • Vô hiệu hóa và kích hoạt DDL kích hoạt
      • Bỏ qua đường dẫn tệp nhà cung cấp mật mã
      • Bỏ qua đường dẫn tệp và nhật ký tệp
      • Bỏ qua kích thước tập tin
      • Bỏ qua vị trí filegroup
      • Bỏ qua đường dẫn tệp danh mục đầy đủ văn bản
      • Bỏ qua vỏ từ khóa
      • Bỏ qua SID đăng nhập
      • Bỏ qua định danh được trích dẫn
      • Bỏ qua lộ trình suốt đời
      • Bỏ qua dấu chấm phẩy giữa các câu
      • Bỏ qua khoảng trắng
      • Mô-đun làm mới tập lệnh
      • Xác thực tập lệnh cho các ràng buộc mới
      • Xác minh tính tương thích đối chiếu
      • Xác minh triển khai
  • Nhấp vào So sánh
    • Bỏ chọn bất kỳ đối tượng nào được gắn cờ để xóa (NB: những đối tượng đó vẫn có thể có sự cố đối chiếu; nhưng vì chúng không được xác định trong mã nguồn / mẫu db mà chúng tôi không biết; dù sao đi nữa, chúng tôi không muốn mất mọi thứ nếu chúng tôi chỉ nhắm mục tiêu thay đổi đối chiếu). Bạn có thể giải mã tất cả cùng một lúc bằng cách nhấp chuột phải vào DELETEthư mục và chọn EXCLUDE.
    • Tương tự như vậy loại trừ cho bất kỳ CREATEđối tượng nào (ở đây vì chúng không tồn tại trong mục tiêu, chúng không thể có đối chiếu sai ở đó; liệu chúng có tồn tại hay không là một câu hỏi cho một chủ đề khác).
    • Nhấp vào từng đối tượng trong THAY ĐỔI để xem tập lệnh cho đối tượng đó. Sử dụng khác biệt để đảm bảo rằng chúng tôi chỉ thay đổi đối chiếu (bất kỳ điều gì khác biệt được phát hiện thủ công bạn sẽ muốn loại trừ / xử lý các đối tượng đó theo cách thủ công).
  • Nhấn vào đây Updateđể đẩy thay đổi

Điều này vẫn liên quan đến một số nỗ lực thủ công (ví dụ: kiểm tra xem bạn chỉ tác động đến đối chiếu) - nhưng nó xử lý các phụ thuộc cho bạn.

Ngoài ra, bạn có thể giữ một dự án cơ sở dữ liệu của lược đồ hợp lệ để bạn có thể sử dụng một mẫu chung cho các DB của mình nếu bạn có nhiều hơn 1 để cập nhật, giả sử tất cả các DB đích sẽ kết thúc với cùng một lược đồ.

Bạn cũng có thể sử dụng find / thay thế trên các tệp trong dự án cơ sở dữ liệu nếu bạn muốn sửa đổi hàng loạt cài đặt ở đó (ví dụ: để bạn có thể tạo dự án từ cơ sở dữ liệu không hợp lệ bằng cách sử dụng so sánh lược đồ, sửa đổi tệp dự án, sau đó chuyển đổi nguồn / đích trong lược đồ so sánh để đẩy các thay đổi của bạn trở lại DB).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.