简体   繁体   English

Oracle 到 SQL Server 迁移中的外键错误

[英]Foreign Key Error in Oracle to SQL Server Migration

So I have been tasked with converting an Oracle DB to SQL Server.所以我的任务是将 Oracle DB 转换为 SQL Server。 I have never worked with DB's before so I am just running MS SQL Server Migration Assistant to start and only received one error regarding foreign keys.我以前从未使用过数据库,所以我只是运行 MS SQL Server 迁移助手来启动,并且只收到一个关于外键的错误。 I have done some research but don't understand the principal enough to know how the change needs to be made.我已经做了一些研究,但对校长的了解不够充分,无法知道需要如何进行更改。 Below are the Oracle and SQL Tables from the migration.以下是迁移中的 Oracle 和 SQL 表。 At the very bottom is the error on the SQL Server side.最底层是 SQL Server 端的错误。 If anyone could lead me in the right direction I would appreciate it.如果有人能引导我朝着正确的方向前进,我将不胜感激。

Oracle Table:甲骨文表:

CREATE TABLE XYZUSER.XYZCMDARGS
( 
    CMDROWKEY NUMBER(10, 0) NOT NULL,
    CMDARGNUM NUMBER(3, 0) NOT NULL,
    MEMBERNAME VARCHAR2(50) NOT NULL,
    MEMBERTYPE NUMBER(1, 0) NOT NULL,
    ARGFORMAT NUMBER(1, 0) NOT NULL,
    STARTBIT NUMBER(2, 0) NOT NULL,
    TOTALBITS NUMBER(2, 0) NOT NULL,
    MSBORLSBFIRST CHAR(1) NOT NULL,
    MEMBERVALUE NUMBER(20, 0) NOT NULL,
    STATELIST VARCHAR2(200) NOT NULL,
    RANGEHIGHFLOAT FLOAT(52) NOT NULL,
    RANGELOWFLOAT FLOAT(52) NOT NULL,
    RANGEHIGHINT NUMBER(20, 0) NOT NULL,
    RANGELOWINT NUMBER(20, 0) NOT NULL,
    UNITS CHAR(8) NOT NULL,
    INCRPERBIT FLOAT(52) NOT NULL,
    ARGPROCESSING NUMBER(1, 0) NOT NULL
);
ALTER TABLE XYZUSER.XYZCMDARGS ADD CONSTRAINT XYZCMDARGS_PK
    PRIMARY KEY (CMDROWKEY, CMDARGNUM);
ALTER TABLE XYZUSER.XYZCMDARGS ADD CONSTRAINT XYZCMDARGS_CMDROWKEY_FK
    FOREIGN KEY (CMDROWKEY)
        REFERENCES XYZUSER.XYZCMDS (CMDROWKEY);

SQL Server: SQL 服务器:

IF EXISTS (SELECT * FROM sys.objects so JOIN sys.schemas sc ON so.schema_id = sc.schema_id WHERE so.name = N'XYZCMDARGS'  AND sc.name = N'XYZUSER'  AND type in (N'U'))
BEGIN

  DECLARE @drop_statement nvarchar(500)

  DECLARE drop_cursor CURSOR FOR
      SELECT 'alter table '+quotename(schema_name(ob.schema_id))+
      '.'+quotename(object_name(ob.object_id))+ ' drop constraint ' + quotename(fk.name) 
      FROM sys.objects ob INNER JOIN sys.foreign_keys fk ON fk.parent_object_id = ob.object_id
      WHERE fk.referenced_object_id = 
          (
             SELECT so.object_id 
             FROM sys.objects so JOIN sys.schemas sc
             ON so.schema_id = sc.schema_id
             WHERE so.name = N'XYZCMDARGS'  AND sc.name = N'XYZUSER'  AND type in (N'U')
           )

  OPEN drop_cursor

  FETCH NEXT FROM drop_cursor
  INTO @drop_statement

  WHILE @@FETCH_STATUS = 0
  BEGIN
     EXEC (@drop_statement)

     FETCH NEXT FROM drop_cursor
     INTO @drop_statement
  END

  CLOSE drop_cursor
  DEALLOCATE drop_cursor

  DROP TABLE [XYZUSER].[XYZCMDARGS]
END 
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE 
[XYZUSER].[XYZCMDARGS]
(
   [CMDROWKEY] numeric(10, 0)  NOT NULL,
   [CMDARGNUM] numeric(3, 0)  NOT NULL,
   [MEMBERNAME] varchar(50)  NOT NULL,
   [MEMBERTYPE] numeric(1, 0)  NOT NULL,
   [ARGFORMAT] numeric(1, 0)  NOT NULL,
   [STARTBIT] numeric(2, 0)  NOT NULL,
   [TOTALBITS] numeric(2, 0)  NOT NULL,
   [MSBORLSBFIRST] char(1)  NOT NULL,
   [MEMBERVALUE] numeric(20, 0)  NOT NULL,
   [STATELIST] varchar(200)  NOT NULL,
   [RANGEHIGHFLOAT] float(52)  NOT NULL,
   [RANGELOWFLOAT] float(52)  NOT NULL,
   [RANGEHIGHINT] numeric(20, 0)  NOT NULL,
   [RANGELOWINT] numeric(20, 0)  NOT NULL,
   [UNITS] char(8)  NOT NULL,
   [INCRPERBIT] float(52)  NOT NULL,
   [ARGPROCESSING] numeric(1, 0)  NOT NULL
)
WITH (DATA_COMPRESSION = NONE)
GO
IF EXISTS (SELECT * FROM sys.objects so JOIN sys.schemas sc ON so.schema_id = sc.schema_id WHERE so.name = N'XYZCMDARGS_PK'  AND sc.name = N'XYZUSER'  AND type in (N'PK'))
ALTER TABLE [XYZUSER].[XYZCMDARGS] DROP CONSTRAINT [XYZCMDARGS_PK]
 GO



ALTER TABLE [XYZUSER].[XYZCMDARGS]
 ADD CONSTRAINT [XYZCMDARGS_PK]
   PRIMARY KEY
   CLUSTERED ([CMDROWKEY] ASC, [CMDARGNUM] ASC)

GO

IF EXISTS (SELECT * FROM sys.objects so JOIN sys.schemas sc ON so.schema_id = sc.schema_id WHERE so.name = N'XYZCMDARGS_CMDROWKEY_FK'  AND sc.name = N'XYZUSER'  AND type in (N'F'))
ALTER TABLE [XYZUSER].[XYZCMDARGS] DROP CONSTRAINT [XYZCMDARGS_CMDROWKEY_FK]
 GO


/* 
*   SSMA error messages:
*   O2SS0231: Foreign keys with different types of columns and referenced columns cannot be converted:XYZCMDARGS_CMDROWKEY_FK.


ALTER TABLE [XYZUSER].[XYZCMDARGS]
 ADD CONSTRAINT [XYZCMDARGS_CMDROWKEY_FK]
 FOREIGN KEY 
   ([CMDROWKEY])
 REFERENCES 
   [ACEDB1A].[XYZUSER].[XYZCMDS]     ([CMDROWKEY])
    ON DELETE NO ACTION
    ON UPDATE NO ACTION

*/

The issue appears to be that the parent table column XYZUSER.XYZCMDS (CMDROWKEY) is declared as a NUMBER(9,0) while the child table column XYZUSER.XYZCMDARGS (CMDROWKEY) is declared as a NUMBER(10,0) .问题似乎是父表列XYZUSER.XYZCMDS (CMDROWKEY)被声明为NUMBER(9,0)而子表列XYZUSER.XYZCMDARGS (CMDROWKEY)被声明为NUMBER(10,0) Since the child table declared a larger column than the parent table allows, it is probably safe to change the child table column to a NUMBER(9,0) (assuming nothing weird is going on where the child table was allowed to store values that are larger than what the parent table allows).由于子表声明了比父表允许的更大的列,因此将子表列更改为NUMBER(9,0)可能是安全的(假设在允许子表存储值的地方没有发生任何奇怪的事情)大于父表允许的值)。 Alternately, you could redefine the parent table column as a NUMBER(10,0) but then you'd need to redefine the column in any other child tables that reference this parent.或者,您可以将父表列重新定义为NUMBER(10,0)但随后您需要在引用此父表的任何其他子表中重新定义该列。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM