2

我们有一个在 MSAccess 中运行但使用 SQL Server 作为后端数据库的应用程序。这会生成一个查询来检查它可以访问哪些视图,对于普通用户来说,这最多需要 18 秒。对于属于 db_owner 角色的所有用户,需要 0.2 秒。有什么办法可以为普通用户调整这个吗?也许我可以在 Access 中做些什么?我不想给他们 db_owner,重写应用程序以不使用 Access 是不可能的。

这是查询:

select 
  object_name(id), 
  user_name(uid), type, 
  ObjectProperty(id, N'IsMSShipped'), 
  ObjectProperty(id, N'IsSchemaBound') 
    from sysobjects 
    where type = N'V' 
      and permissions(id) & 4096 <> 0

使用 MS Access 2003、SQL Server 2008 R2

4

3 回答 3

0

让我猜猜:您有一个在启动时执行此操作的 Access-ADP 应用程序。我们完全一样。此查询用于获取 Access 稍后使用的元数据。问题的根本原因是不推荐使用的 PERMISSIONS 函数:

http://msdn.microsoft.com/en-us/library/ms186915.aspx

引用:“继续使用 PERMISSIONS 函数可能会导致性能下降。”

由于您无法更改查询或函数,因此您很不走运。

我建议您考虑迁移到带有链接表的 ACCDB,因为无论如何 ADP 支持在 Access 2013 中都被取消了。

于 2014-09-26T14:30:32.743 回答
0

派对迟到了,但试试这个:

select
  [name], 
  schema_name(schema_id), 
  [type], 
  Is_MS_Shipped,
  Is_Schema_published
from 
    sys.all_views
where 
    not permissions(object_id) & 4096 = 0

使用特定于视图的对象并反转比较可能会给您带来轻微的改进

于 2014-09-26T14:11:09.627 回答
0

没有找出问题的根本原因,也许解决方法可能会有所帮助?只是一个想法:您可以将您的 SQL 语句封装在 db_owner 拥有的 proc 中,并给它一个 EXECUTE AS子句。这样,当非 db_owner 调用 proc 时,proc 中的 SQL 将在 db_owner 的模拟下执行,仅在 proc 的持续时间和范围内。希望您的非 db_owner 用户将受益于您在 db_owner 运行该 SQL 时所看到的性能。

于 2012-04-15T05:07:02.077 回答