2017-04-11 80 views
1

我已经使用Postgres/Npgsql设置了Sql复制。RavenDB Sql复制和Postgres uuid

我们在Ravendb中使用Guids来标识id。 只要我在Postgres中的id列是varchar类型,但是如果我将它设置为uuid(它应该是匹配Guid的正确类型),那么一切工作都正常,但它失败。

对于除id之外的其他列也会失败。

Postgres的日志给我:

操作符不存在:UUID =人品34 提示文字:没有运营商的指定名称和参数类型相匹配。您可能需要添加显式类型转换。

Postgres的模式是这样的:

CREATE TABLE public.materiels 
(
    id uuid NOT NULL, 
    type character varying(50), 
    nummer integer, 
    ... 
    CONSTRAINT materiels_pkey PRIMARY KEY (id) 
) 

更换第一线与

id character varying(50) NOT NULL 

将使它发挥作用。

我复制设置是这样的:

Replication setup 如果我设置复制为使用MSSQL它的工作原理采用MSSQL的uniqueidentifier数据类型。

回答

2

如果您想比较UUIDTEXT,那么您需要为此创建运算符。在一个解决你的错误是这样的:

CREATE FUNCTION uuid_equal_text(uuid, text) 
RETURNS boolean 
LANGUAGE SQL IMMUTABLE 
AS 
$body$ 
    SELECT $1 = $2::uuid 
$body$; 

CREATE OPERATOR =(
    PROCEDURE = uuid_equal_text, 
    LEFTARG = uuid, 
    RIGHTARG = text); 

编辑:

CREATE CAST (text AS uuid) 
WITH INOUT 
AS IMPLICIT; 
+1

哇那是一个很好的解决方案:通过这个问题,自己的笔者建议替代的解决方案。奇迹般有效。继续惊叹Postgres是多么强大! –

+0

有没有一种方法可以将文本转换为uuid? 此解决方案修复了复制的“DELETE ... WHERE”部分。现在INSERT部分失败。 –

+0

发现CREATE CAST,这似乎能够做到这一点。不能让它工作。 稍后再看更多 –