【发布时间】:2018-04-05 07:38:09
【问题描述】:
我有一个 PostgreSQL 数据库。我想把这个 PostgreSQL 数据库导出到 MS SQL Server 数据库中。
为此,首先我使用以下命令备份schema-only 的PostgreSQL 数据库并将其恢复到SQL Server 数据库中。我只是在 SQL Server 中将timestamp without time zone 类型替换为datetime。
/opt/netiq/idm/apps/postgresql/bin/pg_dump -U admin --schema-only --no-owner --no-privileges testdata > /home/testdata.sql
然后我尝试在 SQL Server 数据库表中恢复 PostgreSQL 数据库数据。我使用以下命令备份 PostgreSQL 数据库数据
/opt/netiq/idm/apps/postgresql/bin/pg_dump -U admin --data-only --column-inserts testdata > /home/testdata.sql
当我尝试从上述转储中恢复数据时,出现以下错误
Conversion failed when converting date and/or time from character string
在下面的查询中
INSERT INTO databasechangelog (id, author, filename, dateexecuted, orderexecuted, exectype, md5sum, description, comments, tag, liquibase) VALUES ('3600', 'IDMRBPM', 'DbRenameTables.xml', '2017-09-06 00:36:31.985959+05:30', 83, 'MARK_RAN', '7:d83f1247d179d535dadf892528470df9', 'renameTable', 'Renaming PORTALREGISTRY to PORTALREGISTRY_ORIG', NULL, '3.1.1');
所以请帮我解决这个问题。
我有一些 PostgreSQL 数据库的以下查询,我想知道 MS SQL Server 中以下的等效查询是什么。
ALTER TABLE ONLY configuration_item ALTER COLUMN id SET DEFAULT nextval('configuration_item_id_seq'::regclass);
ALTER TABLE ONLY securityaccessrights ADD CONSTRAINT accrts_eliid_uk UNIQUE (fwelementiid, permissionid);
ALTER TABLE ONLY portalportlethandles ADD CONSTRAINT portlethandles_pk PRIMARY KEY (portletiid);
CREATE INDEX afcomment_messageid_idx ON afcomment USING btree (messageid);
ALTER TABLE ONLY afactivity ADD CONSTRAINT fk_activity_proc FOREIGN KEY (requestid) REFERENCES afprocess(requestid) ON DELETE CASCADE;
ALTER TABLE ONLY ui_item ADD CONSTRAINT fk_uiitem_citem FOREIGN KEY (id) REFERENCES configuration_item(id);
我正在使用MS SQL Server 2014 - 12.0.4100.1 (X64) 和PostgreSQL 9.3.4
【问题讨论】:
-
dateexecuted列的类型是什么?接受带偏移的值应该是datetimeoffset -
每个 SQL 数据库都有自己的语言方言,有自己的怪癖和非标准扩展。您不太可能通过像这样的简单 export=>restore 从一个数据库移动到另一个数据库。 Postgresql 会做一些不同于 Sql Server 没有的标准的事情,而 Sql Server 会做一些不同于 Postgresql 没有的标准的事情。
-
SQL 标准允许不同级别的合规性,并且没有数据库提供比基本级别合规性更高的功能,尤其是 DDL。例如,SQL Server 就像 Postgres 一样支持序列。 SQL Server 使用 standard 语法
NEXT VALUE FOR而您的示例中的 PostgreSQL 使用 custom 语法nextval('somename') -
'2017-09-06 00:36:31.985959+05:30'的值是一个带有时区的时间戳。它应该映射到datetimeoffset -
@PanagiotisKanavos 感谢您的回复,我无法将列的类型从
datetime更改为datetimeoffset。我有一个查询SELECT pg_catalog.setval('configuration_item_id_seq', 100, true);我必须在 SQL Server 中使用什么来代替这个,你能帮我解决这个问题吗?
标签: sql-server postgresql sql-server-2008 sql-server-2014 database-migration