0

因此,我的任务是将 Oracle DB 转换为 SQL Server。我以前从未使用过数据库,所以我只是运行 MS SQL Server 迁移助手来启动并且只收到一个关于外键的错误。我做了一些研究,但对校长的了解还不够,无法知道需要如何进行更改。以下是迁移中的 Oracle 和 SQL 表。最底部是 SQL Server 端的错误。如果有人能引导我朝着正确的方向前进,我将不胜感激。

甲骨文表:

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 服务器:

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

*/
4

1 回答 1

0

问题似乎是父表列XYZUSER.XYZCMDS (CMDROWKEY)被声明为,NUMBER(9,0)而子表列XYZUSER.XYZCMDARGS (CMDROWKEY)被声明为NUMBER(10,0). 由于子表声明的列大于父表允许的列,因此将子表列更改为 a 可能是安全的NUMBER(9,0)(假设在允许子表存储大于父表的值的地方没有发生任何奇怪的事情允许)。或者,您可以将父表列重新定义为 a NUMBER(10,0),但随后您需要在引用此父项的任何其他子表中重新定义该列。

于 2020-10-06T20:06:57.170 回答