我们有一个在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
答案 0 :(得分:0)
如果找不到问题的根本原因,或许解决问题可能有所帮助?只是一个想法:您可以将SQL语句封装在db_owner拥有的proc中,并为其指定EXECUTE AS子句。这样,当一个非db_owner调用proc时proc中的SQL将在db_owner的模拟下执行,只是为了proc的持续时间和范围。希望您的非db_owner用户可以从db_owner运行该SQL时所看到的性能中受益。
答案 1 :(得分: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
使用视图特定对象并反转比较可能会略微改善
答案 2 :(得分:0)
让我猜一下:你有一个Access-ADP应用程序在启动时执行此操作。我们完全一样。此查询用于获取Access稍后使用的元数据。问题的根本原因是已弃用的PERMISSIONS函数:
http://msdn.microsoft.com/en-us/library/ms186915.aspx
引用:“继续使用PERMISSIONS函数可能会导致性能降低。”
由于您无法更改查询或功能,因此您运气不佳。
我建议您考虑使用链接表转移到ACCDB,因为无论如何,在Access 2013中取消了ADP支持。