【问题标题】:Porting a view from SAP SQL Anywhere to Postgres [duplicate]将视图从 SAP SQL Anywhere 移植到 Postgres [重复]
【发布时间】:2019-03-13 00:44:56
【问题描述】:

我目前正在研究将 Postgres 作为 SAP SQL Anywhere 的可能替代方案。我已经成功地将我们的开发数据库(700 个表)移植到 Postgres 中,现在正尝试在 Postgres 数据库中创建一些等效视图。

以下内容:

CREATE VIEW "SYS_Authorisation_BO_Access_View"
AS
SELECT     ROW_NUMBER() OVER (ORDER BY t1.OID) AS OID, t1.OID as BusinessObjectTypeID, t1.TypeName, t1.AccessType, t1.GroupID, a.Authorised, t1.defaultboauthorisation, COALESCE (a.Authorised, t1.defaultboauthorisation) 
                      AS FinalAuthorisation
FROM         "SYS_Authorisation_BO_Access" AS ab INNER JOIN
                      "SYS_Authorisation" AS a ON a.OID = ab.OID RIGHT OUTER JOIN
                          (SELECT     o.OID, o.TypeName, at.AccessType, g.OID as GroupID, 
                                                   CASE at.accesstype WHEN 'C' THEN g.defaultbocreateauthorisation WHEN 'M' THEN g.defaultbomodifyauthorisation WHEN 'D' THEN g.defaultbodeleteauthorisation
                                                    END AS defaultboauthorisation
                            FROM          XPObjectType AS o CROSS JOIN
                                                       (SELECT     'C' AS AccessType
                                                         UNION
                                                         SELECT     'D' AS AccessType
                                                         UNION
                                                         SELECT     'M' AS AccessType) AS at CROSS JOIN
                                                   SYS_Group AS g) AS t1 ON ab.BusinessObjectTypeID = t1.OID AND ab.AccessType = t1.AccessType AND a.GroupID = t1.GroupID

产生以下错误:

ERROR:  column a.oid does not exist
LINE 6:                       "SYS_Authorisation" AS a ON a.OID = ab...

【问题讨论】:

    标签: postgresql quoted-identifier


    【解决方案1】:

    好的,事实证明这都是区分大小写的。 SAP SQL 不区分大小写,Postgres 不区分。

    以下修改后的 SQL 起作用了:

    CREATE VIEW "SYS_Authorisation_BO_Access_View"
    AS
    SELECT     ROW_NUMBER() OVER (ORDER BY t1."OID") AS "OID", t1."OID" as "BusinessObjectTypeID", t1."TypeName", t1."AccessType", t1."GroupID", a."Authorised", t1."DefaultBOAuthorisation", COALESCE (a."Authorised", t1."DefaultBOAuthorisation") 
                          AS "FinalAuthorisation"
    FROM         "SYS_Authorisation_BO_Access" AS ab INNER JOIN
                          "SYS_Authorisation" AS a ON a."OID" = ab."OID" RIGHT OUTER JOIN
                              (SELECT     o."OID", o."TypeName", at."AccessType", g."OID" as "GroupID", 
                                                       CASE at."AccessType" WHEN 'C' THEN g."DefaultBOCreateAuthorisation" WHEN 'M' THEN g."DefaultBOModifyAuthorisation" WHEN 'D' THEN g."DefaultBODeleteAuthorisation"
                                                        END AS "DefaultBOAuthorisation"
                                FROM          "XPObjectType" AS o CROSS JOIN
                                                           (SELECT     'C' AS "AccessType"
                                                             UNION
                                                             SELECT     'D' AS "AccessType"
                                                             UNION
                                                             SELECT     'M' AS "AccessType") AS at CROSS JOIN
                                                       "SYS_Group" AS g) AS t1 ON ab."BusinessObjectTypeID" = t1."OID" AND ab."AccessType" = t1."AccessType" AND a."GroupID" = t1."GroupID"
    

    【讨论】:

    • Postgres 仅在您使用那些可怕的带引号的标识符时才区分大小写:postgresql.org/docs/current/static/… 我强烈建议在 SQL 中根本不要使用双引号(通常,不仅是 Postgres)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2018-08-08
    • 2011-09-29
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多