简体   繁体   中英

Foreign Key Error in Oracle to SQL Server Migration

So I have been tasked with converting an Oracle DB to 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. 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. At the very bottom is the error on the SQL Server side. 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:

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) . 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). 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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