无权限时如何判断链接服务器上的对象是表还是视图?
判断链接服务器上对象是表还是视图的可行方法
既然你没法直接访问链接服务器上的关联对象,这里有几个实用的方法可以尝试判断[abcd]是表还是视图:
查询链接服务器的系统目录视图
虽然你没有直接访问abcd的权限,但可以尝试通过OPENQUERY调用链接服务器的系统对象来获取类型信息。执行以下SQL:SELECT type_desc FROM OPENQUERY([linked_server], 'SELECT type_desc FROM [database].[sys].[objects] WHERE name = ''abcd'' AND schema_id = SCHEMA_ID(''schema'')')如果成功返回结果,
type_desc字段会明确显示USER_TABLE(表)或VIEW(视图)。不过这个方法依赖于你的登录账号在链接服务器上有访问sys.objects的权限,很多环境里这个权限是开放给普通用户的。查看执行计划细节
在SSMS里运行引用该对象的视图时,开启实际执行计划(快捷键Ctrl+M),或者执行SET SHOWPLAN_XML ON后再运行查询。查看执行计划的内容:- 如果是表,执行计划里会显示针对远程表的扫描/查找操作(比如
Remote Scan关联的对象类型是表); - 如果是视图,执行计划通常会展开视图的底层查询逻辑,或者在计划的XML里能找到标识为
VIEW的对象节点。
- 如果是表,执行计划里会显示针对远程表的扫描/查找操作(比如
调用远程的系统存储过程
尝试远程执行sp_help存储过程,它会返回对象的详细信息,包括类型:EXEC [linked_server].[database].[dbo].[sp_help] 'schema.abcd'结果集中的
Type列会直接告诉你这是表还是视图。同样,这个方法需要你有执行远程sp_help的权限。通过尝试无修改的更新操作验证(谨慎使用)
你可以开启一个事务,执行一个不会实际修改数据的UPDATE语句,然后根据报错信息判断:BEGIN TRANSACTION -- 注意:这里要替换成实际存在的列,确保没有实际数据变更 UPDATE [linked_server].[database].[schema].[abcd] SET existing_column = existing_column ROLLBACK TRANSACTION- 如果报错提示无法更新视图,那
abcd肯定是视图(且是不可更新视图,这是大部分视图的情况); - 如果报错提示权限不足,那大概率是表(如果是可更新视图,也可能报权限不足,但这种情况相对少见)。
- 如果报错提示无法更新视图,那
这些方法可以根据你的权限情况逐个尝试,总有一个能帮你确定对象类型。
内容的提问来源于stack exchange,提问作者DrHouseofSQL
相关产品推荐
相关产品推荐

