在使用PostgreSQL时,我应该在select语句中定义模式的位置(或如何)?

时间:2009-03-16 18:06:09

标签: asp.net postgresql schema npgsql

我有一个基于ASP.NET 3.5和PostgreSQL 8.3构建的应用程序。我的数据库有3个用户,一个数据所有者(xxx-owner),一个数据编辑器(xxx-editor)和一个数据查看器(xxx-viewer)。每个用户都有自己的架构,称为xxx-schema,xxx-editor-schema和xxx-viewer-schema。所有数据都存储在xxx-schema中。

这要求我在以xxx-editor或xxx-viewer用户身份连接数据库时指定架构,如下面的代码段所示。

NpgsqlCommand pgCommand = new NpgsqlCommand();
pgCommand.CommandText = @"SELECT 
                        bldg_id,
                        bldg_name,
                        bldg_no,
                        FROM " + this.schema + @".buildings
                        WHERE UPPER(bldg_id) LIKE UPPER(@id);";

pgCommand.Parameters.Add("@id", "%" + id + "%");
pgCommand.Connection = pgConnection;

如果我要遵循这条路线,我会在Web.config中指定架构。但是,必须有更好的方法来指定应该使用哪个模式。如果可能的话,我希望能够完全删除字符串连接。

定义要在SQL语句中使用的模式的最佳方法是什么?


修改

以下PostgreSQL User Manual看起来很有希望。

  

SearchPath - 将搜索路径更改为指定和公共架构。

从我的有限测试中,它可以在我的情况下正常工作。但是,这是PostgreSQL唯一的解决方案。是否有更多数据库无关的解决方案,大多数数据库是否提供了这样的功能?


编辑2

我在下面标记了答案,这使我在数据库级别更改了架构查找顺序。通过以下更改,我不需要在SQL语句中添加代码。

ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde

2 个答案:

答案 0 :(得分:3)

您可以使用以下方式在每个会话的基础上设置架构搜索路径:

SET search_path TO myschema

如果您想回退到公共架构,可以使用:

SET search_path TO myschema, public

答案 1 :(得分:0)

你也可以这样做:

SET SCHEMA' myschema';

此声明与SET search_path TO myschema, public但更多

相同