快速REST API中的多个mssql连接

时间:2017-12-18 17:58:47

标签: sql-server node.js api express routes

我已经组成了一条带有几条路线的快速服务器。计划是通过连接池为每个路由提供自己的mssql连接,但看起来模块只能有一个全局连接。我在这里做错了还是打算这样做?

另外,如果可能,我是否应该这样做?我应该为每个数据库使用一个API吗?所有这些数据库都在一个引擎上,并且是单独的模式。

2 个答案:

答案 0 :(得分:1)

该模块允许您设置连接池,这些连接池充当用户与数据库的连接。因此,如果要连接到其他数据库,则必须使用其他池。例如:

const config1 = {
    user: 'username',
    password: 'password',
    server: 'server1',
    database: 'database1',
    options: {
        // ...
    }
}
const config2 = {
    user: 'username',
    password: 'password',
    server: 'server1',
    database: 'database2'
    // ...
}

const pool1 = new sql.ConnectionPool(conf1, err => {
    // ...
})
const pool2 = new sql.ConnectionPool(conf2, err => {
    // ...
})

现在,当您想要访问database1时,可以使用pool1,依此类推。有关详细信息,请refer to the mssql documentation。但是,这里的主题是,如果要访问不同的数据库,必须使用不同的连接池。另外要小心如何在SQL Server周围使用“schema”一词。 SQL的一般上下文中的模式指的是数据库或表的结构,但在Microsoft的SQL Server中,它还可以引用一种功能,该功能允许您在数据库内命名表以用于管理,所有权和安全性目的。有关更好的说明,请参阅this technet article。正如拉努在评论中所说,层次结构为[database].[schema].[table]。由于连接池访问数据库,因此您无需指定该位 - 您可以坚持使用[schema].[table],甚至可以根据您的设置省略架构。

现在关于你是否将池分开,显然你必须使用多个数据库。否则,如果它是相同的数据库,我认为我们需要更多的上下文,即便如此它也不是黑白的。

请记住,连接池是用户登录到数据库 - 它具有与该用户相同的权限。那么您是否希望RouteA只能访问某些数据库对象并确保这是强制数据库端的?然后设置数据库用户(RouteAUser),为该路由设置连接池(PoolA),并在该池的配置中使用RouteAUser的凭据,依此类推。如果所有数据访问都是在应用程序内部编写的,对最终用户是隐藏的,那么您可能不需要这样做 - 只需编写RouteA的代码,以便它只访问您想要的对象。

答案 1 :(得分:0)

  

如果两个数据库需要一起查询怎么办?

mssql包允许您使用表限定符访问不同的数据库。

const result1 = pool.request().query("select * from DATABASE1..table1 t JOIN DATABASE2..table1 t2 ON t1.id = t2.id")