使用Microsoft Azure,我使用简易表(node.js后端)创建了一个数据库。我有几张桌子和一张视图。
有一个技巧可以使视图像我已经完成的一个简单的表格一样工作。
问题: 使用此代码从视图中读取数据时,我会收到所有数据 - 包括其他用户的数据。
table.read(function (context) {
return context.execute();
});
这是有道理的,因为我没有指定我只想要经过身份验证的用户的数据。
使用此代码时,我没有数据:
// READ operation
table.read(function (context) {
context.query.where({ userId: context.user.id });
return context.execute();
});
将上述代码用于实际表而非视图效果非常好。
从日志文件:
2017-01-02T18:52:00.945Z - silly: Executing SQL statement SELECT TOP 3 * FROM [dbo].[ClassData] WHERE (([userId] = @p1) AND ([deleted] = @p2)); with parameters [{"name":"p1","pos":1,"value":"sid:REMOVED"},{"name":"p2","pos":2,"value":false}]
2017-01-02T18:52:00.945Z - silly: Read query returned 2 results
sprintf() will be removed in the next major release, use the sprintf-js package instead.
2017-01-02T18:52:01.867Z - silly: Executing SQL statement SELECT TOP 10 * FROM [dbo].[StacksNamesView] WHERE (([userId] = @p1) AND ([deleted] = @p2)) ORDER BY [createdAt]; with parameters [{"name":"p1","pos":1,"value":"sid:REMOVED"},{"name":"p2","pos":2,"value":false}]
2017-01-02T18:52:01.883Z - debug: SQL statement failed - Invalid column name 'userId'.: SELECT TOP 10 * FROM [dbo].[StacksNamesView] WHERE (([userId] = @p1) AND ([deleted] = @p2)) ORDER BY [createdAt]; with parameters [{"name":"p1","pos":1,"value":"sid:REMOVED"},{"name":"p2","pos":2,"value":false}]
更新:
创建Azure App Service EasyTables时,“userId”列自动成为每个表的一部分。但是,通过Azure门户查看架构时,它不可见。这就是我的困惑所在。
解:
将视图用作EasyTable并且需要“隐藏”userId列时,请确保将其选为视图的一部分!只要您的其他EasyTable正在执行此帖子中的第二个代码块等查询,这将有效。