如何复制时间戳数据类型

时间:2018-09-06 07:49:10

标签: sybase sybase-ase

我有一个带有S70列的表:

TIMESTAMP

当我使用以下任一方法将行从一个表复制到另一个表时:

create  table dbo.EX_EMPLOYEE (
    NAME_X            varchar(10) null,
    RECORD_TIME_STAMP timestamp   null
    )

或:

SELECT * INTO EX_EMPLOYEE_T 
    FROM EX_EMPLOYEE 
    WHERE 1=0

我收到此警告:

  

警告:用户不能将非null值插入INSERT INTO EX_EMPLOYEE_T SELECT * FROM EX_EMPLOYEE 列中。数据库时间戳记值已插入TIMESTAMP字段中。

目标表中的TIMESTAMP列已替换为当前数据库时间戳。

我的问题
如何在保留源表中的TIMESTAMP值的同时复制带有TIMESTAMP列的行?

(是否存在类似于TIMESTAMP的设置)

我的情况
我有2个表,一个表用于“实时”数据,另一个表用于“备份”,因此我需要复制SET IDENTITY ON/OFF完整的行。我需要完整无缺,以检测“实时”行是否发生了变化。

1 个答案:

答案 0 :(得分:3)

Sybase(现在为SAP)复制服务器(SRS)可以在Sybase / SAP ASE表之间复制时间戳记值,即SRS maintuser可以将显式值插入类型为timestamp的列中。

这怎么可能?有一些要求:

  • 执行插入操作(到timestamp列的用户必须具有replication_role角色(并且必须处于活动状态)
  • 您需要发出set timestamp_insert on命令(注意:如果您的用户没有replication_role,这将产生一个错误)
  • 您需要在insert语句中显式列出目标表的列

设置:

exec sp_displaylogin
go
...
Configured Authorization:
        ...
        replication_role (default ON)      <<<=== verify role assigned and active
        ...

create table EX_EMPLOYEE
(NAME_X                 varchar(10)     NULL
,RECORD_TIME_STAMP      timestamp       NULL
)
go

insert into EX_EMPLOYEE (NAME_X) values ('Larry')
insert into EX_EMPLOYEE (NAME_X) values ('Mo')
insert into EX_EMPLOYEE (NAME_X) values ('Curly')
go

select * from EX_EMPLOYEE
go

 NAME_X     RECORD_TIME_STAMP
 ---------- ------------------
 Larry      0x00000000ec4304fa
 Mo         0x00000000ec4304fd
 Curly      0x00000000ec430501

select * into EX_EMPLOYEE_T FROM EX_EMPLOYEE where 1=2
go

现在可以进行一些插入测试了……

-- haven't issued the 'set timestamp_insert on' commmand, yet

insert into EX_EMPLOYEE_T
select * from EX_EMPLOYEE
go

Warning: A non-null value cannot be inserted into a TIMESTAMP column by the user. The database timestamp value has been inserted into the TIMESTAMP field instead.

-- received the *WARNING*, ie, rows are inserted but they receive new timestamp values

select * from EX_EMPLOYEE_T
go

 NAME_X     RECORD_TIME_STAMP
 ---------- ------------------
 Larry      0x00000000ec430548       <<<=== different from what's in EX_EMPLOYEE
 Mo         0x00000000ec43054a       <<<=== different from what's in EX_EMPLOYEE
 Curly      0x00000000ec43054c       <<<=== different from what's in EX_EMPLOYEE

-- enable direct insert of timestamp values

set timestamp_insert on
go

truncate table EX_EMPLOYEE_T
go

-- w/out explicitly listing target columns ...

insert into EX_EMPLOYEE_T
select * from EX_EMPLOYEE
go

-- no warning message is generated, insert succeeds, but new timestamp values are generated

select * from EX_EMPLOYEE_T
go

 NAME_X     RECORD_TIME_STAMP
 ---------- ------------------
 Larry      0x00000000ec430555       <<<=== different from what's in EX_EMPLOYEE
 Mo         0x00000000ec430557       <<<=== different from what's in EX_EMPLOYEE
 Curly      0x00000000ec430559       <<<=== different from what's in EX_EMPLOYEE

truncate table EX_EMPLOYEE_T
go

-- this time we'll explicitly list the target table's columns ...

insert into EX_EMPLOYEE_T (NAME_X, RECORD_TIME_STAMP)
select * from EX_EMPLOYEE
go

-- and now we see the timestamp values copied from the source

select * from EX_EMPLOYEE_T
go

 NAME_X     RECORD_TIME_STAMP
 ---------- ------------------
 Larry      0x00000000ec4304fa       <<<=== same as what's in EX_EMPLOYEE
 Mo         0x00000000ec4304fd       <<<=== same as what's in EX_EMPLOYEE
 Curly      0x00000000ec430501       <<<=== same as what's in EX_EMPLOYEE

以上已在ASE 15.7 SP138数据服务器上进行了测试。