精华内容
下载资源
问答
  • PL/SQL 工具 查看引用对象方式

    千次阅读 2018-11-19 23:35:39
    例如,存在一个表,表名为datatest,查看有哪些对象使用了这个表 oracle 查询语句 1,以DBA方式查询 select name,type from dba_dependencies where referenced_name =upper('datatest') 另外,查询引用的...

    例如,存在一个表,表名为datatest,查看有哪些对象使用了这个表

    oracle 查询语句

    1,以DBA方式查询

    select name,type from dba_dependencies  where referenced_name =upper('datatest') 

    另外,查询引用的相关语句,可通过下述方式

    select name,type,text from dba_source where upper(text) like '%DATATEST%'

    这个时候,只能查找到相关函数、存储过程,结果如下:

    2, 以普通数据库用户形式查询

    select name,type from all_dependencies  where referenced_name =upper('datatest')   

    结果如下:

    类似的,普通用户查询引用的相关语句,可通过下述方式

    select name,type,text from user_source where upper(text) like '%DATATEST%'   

    这种查询也只能获取相关函数、包、存储过程,而不能获取视图对象,结果如下:

    采用工具-发现数据对象

    点击菜单 Tools-Find Database Objects... ,打开“对象查询”对话框

    在“对象查询”对话框中输入“datatest”,点击“Search”按钮,可获取相关对象结果。

    在数据库对象不多时,这种方法查找还可以,当对象多时,将会很花时间。

    采用对象-Tables

    在“对象浏览”对话框中选择“Tables” 文件夹,如下图所示

     

    在Tables 文件夹下找到 datatest ,点击该对象左边的 + 号,展开该对象下的相关内容,找到“Referenced  by” 内容,点击该内容左边的+号

    最后结果如下:

    默认情况下,“对象浏览”对话框正常打开,如不小心关闭,可通过点击菜单Tools-Object Browser 打开。

    展开全文
  • Unity3D Game窗口下查看Overdraw视图

    万次阅读 2017-04-17 18:43:32
    Unity3D中 实现了Game窗口下查看Overdraw视图
    overdraw简单来说,就是一个像素在荧幕被绘制了多次。
    在像素处理中,overdraw是最常见的性能瓶颈之一。

    上个项目中优化过,全屏UI渲染时,游戏主场景在UI后重复绘制,导致完全没有必要的Overdraw。


    引用 冯乐乐的文章中的一句话
    Unity提供了查看 overdraw的视图 ,在Scene视图的RenderMode->Overdraw。当然这里的视图只是提供了查看物体遮挡的层数关系,并不是真正的最终屏幕绘制的overdraw。也就是说,可以理解为它显示的是如果没有使用任何深度检验时的overdraw。这种视图是通过把所有对象都渲染成一个透明的轮廓,通过查看透明颜色的累计程度,来判断物体的遮挡。


    只关心结果的同学请直接跳转到最终实现方法


    事情的起因是群里的一些讨论,感到好奇决定试试

    请教一下怎么弄在Game窗口显示? Unity技术太菜

    丑哥:“参考Editor反汇编出来的代码……抄一部分= =


    那好。从抄一部分开始


    一开始尝试反编译UnityEditor中的
    private void PrepareCameraReplacementShader()
    可是一直获取下面 方法失败
    using System.Runtime.CompilerServices;
    internal static void SetSceneViewColors(Color wire, Color wireOverlay, Color selectedOutline, Color selectedWire)
    {
        Handles. INTERNAL_CALL_SetSceneViewColors( ref wire, ref wireOverlay, ref selectedOutline, ref selectedWire);
    }
    内嵌的C程序无法正常调用
    试了几种方法无果后,放弃了。

    如果大家有可以自由调用 [ MethodImpl(MethodImplOptions.InternalCall)]方法的请不吝赐教,O(∩_∩)O谢谢


    费了那么多话,进入正题。

    具体实现思路请参阅资料 Rendering with Replaced Shaders
    主要应用了Camera.SetReplacementShader(Shader shader, string replacementTag);
    这个方法可以让我们用指定的shader渲染场景
    • If replacementTag is empty, then all objects in the scene are rendered with the given replacement shader.
    • If replacementTag is not empty, then for each object that would be rendered:
      • The real object’s shader is queried for the tag value.
      • If it does not have that tag, object is not rendered.
      • subshader is found in the replacement shader that has a given tag with the found value. If no such subshader is found, object is not rendered.
      • Now that subshader is used to render the object.


    一开始通过偷懒的方法取得了内置shader
                s_ShowOverdrawShader = (UnityEditor.EditorGUIUtility.LoadRequired("SceneView/SceneViewShowOverdraw.shader") as Shader);
                Camera.main.SetReplacementShader(s_ShowOverdrawShader, "");
    并不能呈现出和SceneMode下相同的效果,黑屏。并不知道原因。
    已经查出原因,黑屏效果是因为Camera renderpath是因为渲染问题场景摄像机被改成deffered 而不是Forward 
    正常应用Forwad即可,即是说不需要之后的单独写shader用Unity自带的的即可。代码也可以大大简化

    也没查到UnityEditor下的shader源码, Hidden/SceneViewShowOverdraw
    根据资料所说如果RenderType参数填空字符串,场景中所有渲染的shader都将替换成所提供的shader

    最终实现方法:

    Shader "Custom/Overdraw"
    {
        SubShader
        {
            Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
            LOD 100
            Fog { Mode Off }
            ZWrite Off
            ZTest Always
            Blend One One
     
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
             
                #include "UnityCG.cginc"
     
                struct appdata
                {
                    float4 vertex : POSITION;
                };
     
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                };
     
                v2f vert (appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    return o;
                }
             
                fixed4 frag (v2f i) : SV_Target
                {
                    return fixed4(0.1, 0.04, 0.02, 0);
                }
                ENDCG
            }
        }
    }

    对应C#脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(Camera))]
    public class DebugOverdrawMode : MonoBehaviour {
    
        public Shader m_OverdrawShader;
    
        private Camera m_Camera;
        private bool m_SceneFogSettings = false;
        private CameraClearFlags m_ClearFlagSetting;
        private Color m_BackGroundColor;
    
        void Awake()
        {
            m_Camera = GetComponent
        
         ();
            StoreParam();
        }
    
        //void OnLevelWasLoaded()
        //{
        //    //每次场景加载取消雾效,缓存并在OnDisable后恢复
        //    m_SceneFogSettings = RenderSettings.fog;
        //    RenderSettings.fog = false;
        //}
    
        void StoreParam()
        {
            m_SceneFogSettings = RenderSettings.fog;
            RenderSettings.fog = false;
    
            m_ClearFlagSetting = m_Camera.clearFlags;
            m_BackGroundColor = m_Camera.backgroundColor;
        }
    
        void OnEnable()
        {
            if (m_OverdrawShader == null)
            {
                m_OverdrawShader = Shader.Find("Custom/Overdraw");
                //m_OverdrawShader = UnityEditor.EditorGUIUtility.LoadRequired("SceneView/SceneViewShowOverdraw.shader") as Shader; //应用unity自带shader即可达到相同效果
            }
    
            if (m_OverdrawShader != null && m_Camera != null)
            {
                RenderSettings.fog = false;
                m_Camera.clearFlags = CameraClearFlags.Color;
                m_Camera.backgroundColor = Color.black;
                m_Camera.SetReplacementShader(m_OverdrawShader, "");
                bChanged = true;
            }
        }
    
        void OnDisable()
        {
            if (m_Camera != null)
            {
                RestoreParam();
            }
        }
    
        void RestoreParam()
        {
            RenderSettings.fog = m_SceneFogSettings;
            //m_Camera.SetReplacementShader(null, ""); //和下面效果相同
            m_Camera.ResetReplacementShader();
            m_Camera.backgroundColor = m_BackGroundColor;
            m_Camera.clearFlags = m_ClearFlagSetting;
        }
    
        //测试方法 为了方便切换  可在非运行模式下测试
        bool bChanged;
        bool bInited;
        [ContextMenu("ChangeMode")]
        public void ChangeMode()
        {
            if (bChanged)
            {
                RestoreParam();
            }
            else
            {
                if (!bInited)
                {
                    m_Camera = GetComponent
         
          ();
                    StoreParam();
                    m_OverdrawShader = Shader.Find("Custom/Overdraw");
                    bInited = true;
                }
    
                RenderSettings.fog = false;
                m_Camera.clearFlags = CameraClearFlags.Color;
                m_Camera.backgroundColor = Color.black;
                m_Camera.SetReplacementShader(m_OverdrawShader, "");
            }
            bChanged = !bChanged;
        }
    }
    
         
        

    挂载到MainCamera上即可, 通过MenuItem可以切换模式(偷懒的方法但是可在非运行状态下切换,正式请自行编写脚本Editor)


    实现效果如下
    正常模式:


    OverDraw Game模式:


    Scene下Overdraw模式


    可以看出基本和原版相同
    但可以看出shader中的代码
     ZWrite Off ZTest Always
    和实际应用上的绘制肯定是有区别的
    下面是
    Zwrite On ZTest LEqual的效果



    具体效果还要根据实际情况修改shader
    由于仅是好奇才实现了这种效果,具体在项目中并未真正应用,这只是一个不完全正确的Overdraw示意图,仅供参考


    如有写错的地方或者大家可以找到原shader,还望不吝指教  谢谢~
    O(∩_∩)O 

    参考文章:


    4.18补充:

    其实主要的代码仅有两句
                Shader s_ShowOverdrawShader = (UnityEditor.EditorGUIUtility.LoadRequired("SceneView/SceneViewShowOverdraw.shader") as Shader);
                Camera.main.SetReplacementShader(s_ShowOverdrawShader, "");

    也可以替换SceneView/SceneViewShowMips.shader 查看mips

    丑哥说明了:它这个没考虑z discard情况 只能大概看一下,精确的看还是要用驱动工具
    Editor里的mipmap也是类似,它直接根据距离算了mipmap level,没考虑贴图可能压根没开的情况……

    源码可以在这里找到
    https://gist.github.com/aras-p/60377c7542a5175d520078ffa53d1275
    需要翻墙

    展开全文
  • 使用CFArray保持对象的弱引用

    千次阅读 2019-11-27 18:52:48
    创建CFArray对象 NSMutableArray *array = (__bridge_transfer NSMutableArray *)CFArrayCreateMutable(nil, 0, nil); 需求 ...有很多类需要加通知,...用NSArray 管理对象循环引用 用NSArray 里面放通知的对...

    创建CFArray对象

    NSMutableArray *array = (__bridge_transfer NSMutableArray *)CFArrayCreateMutable(nil, 0, nil);
    
    

    需求

    有很多类需要加通知,通知更新视图,把所有的通知都添加到一个单利的数组里面,遍历数组去执行视图的更新,

    用NSArray 管理对象循环引用

    • 用NSArray 里面放通知的对象,造成了强引用,这样导致这个类无法释放。

    用底层CFArray管理对象

    • 这样并不会增加对象的引用计数,对象能正常释放,

    • 但需要注意在对象被dealloc时,移除CFArray的引用关系,不然会形成野指针,导致崩溃。

    展开全文
  • SQLServer 查看对象间依赖关系

    千次阅读 2016-08-03 09:52:25
    SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同。 父子关系对象,不通过依赖关系来查询,比如: 1. 外键关系 use tempdb GO --drop table tb...

    在SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同。

    父子关系的对象,不通过依赖关系来查询,比如:

    1. 外键关系

    复制代码
    use tempdb
    GO
    --drop table tb1,tb2
    create table tb1
    (
    col1 int Primary key,
    col2 int
    )
    insert into tb1 values (2,2),(3,2),(4,2),(5,2)
    GO
    create table tb2
    (
    col3 int primary key,
    col4 int constraint FK_tb2 foreign key  references tb1(col1)
    )
    GO
    --检查外键
    select object_name(constraint_object_id) constraint_name,
           object_name(parent_object_id) parent_object_name,
           col_name(parent_object_id,parent_column_id) parent_object_column_name,
           object_name(referenced_object_id) referenced_object_name,
           col_name(referenced_object_id,referenced_column_id) referenced_object_column_name
     from sys.foreign_key_columns
    where referenced_object_id = object_id('tb1')
    复制代码

    2. 表上的索引,触发器

    复制代码
    use tempdb
    GO
    if OBJECT_ID('T','U') is not null
        drop table T
    create table T(id int)
    GO
    
    if exists(select 1 from sys.indexes where name = 'IX_001' and object_id = object_id('T','U'))
        drop index T.IX_001
    create index IX_001 on T(id)
    
    if OBJECT_ID ('test_dml_trigger', 'TR') is not null
       drop trigger test_dml_trigger
    GO
    create trigger test_dml_trigger
    ON T
    AFTER INSERT, UPDATE 
    AS 
    RAISERROR ('Notify Customer Relations', 16, 10);
    GO
    
    --检查索引
    select object_name(object_id) as table_name,* 
    from sys.indexes 
    where name = 'IX_001' and object_id = object_id('T','U')
    
    --检查DML触发器
    select name as table_name, object_name(a.parent_obj) as dml_trigger_name
    from sysobjects a
    where a.xtype = 'TR'
    复制代码

     

    在SSMS中,数据库对象上右击/View Dependencies,可以查看到对象的依赖关系,那么用脚本怎么检查?

    复制代码
    create database DB1;
    create database DB2;
    
    use DB1
    GO
    if OBJECT_ID('T1','U') is not null
        drop table T1
    GO
    create table T1(id int);
    GO
    
    if OBJECT_ID('V1','V') is not null
        drop view V1
    GO
    create view V1
    as 
    select * from T1
    GO
    
    if OBJECT_ID('SP1','P') is not null
        drop proc SP1
    GO
    create proc SP1
    as
    select * from V1
    GO
    
    use DB2
    GO
    if OBJECT_ID('SP2','P') is not null
        drop proc SP2
    GO
    create proc SP2
    as
    select * from DB1..V1
    GO
    
    use DB1
    GO
    if OBJECT_ID('SP3','P') is not null
        drop proc SP3
    GO
    create proc SP3
    as
    exec DB2..SP2
    GO
    
    use DB1
    GO
    if object_id('test_schema.T2','U') is not null
        drop table test_schema.T2
    GO
    if exists(select 1 from sys.schemas where name  = 'test_schema')
        drop schema test_schema
    GO
    create schema test_schema
    create table test_schema.T2(c1 int, c2 int)
    GO
    
    if OBJECT_ID('SP4','P') is not null
        drop proc SP4
    GO
    create proc SP4
    as
    select * from test_schema.T2
    GO
    复制代码

     

    一. SQL Server 2000依赖关系查询

    复制代码
    --从SQL Server 2000沿用下来的系统表,SQL Server 2016仍适用,后续版本将不再支持
    USE DB1
    SELECT o.name, o.xtype, p.name as referenced_name, p.xtype
    FROM sysdepends d
    INNER JOIN sysobjects o
        ON d.id = o.id
    INNER JOIN sysobjects p
        ON d.depid = p.id
    
    --从SQL Server 2000沿用下来的存储过程,SQL Server 2016仍适用,后续版本将不再支持
    USE DB1
    exec sp_depends 'V1'
    
    --无文档记载的sp_MS存储过程,只能检查被自己引用的对象,SQL Server 2016仍适用
    exec sp_MSdependencies 'V1'
    复制代码

    注意:sysdepends, sp_depends, sp_MSdependencies 只能检查当前数据库对象的引用/被引用,对于跨数据库对象依赖关系,无法检查。

     

    二. SQL Server 2005依赖关系查询

    复制代码
    --从SQL Server 2005沿用下来的系统视图,SQL Server 2016仍适用,后续版本将不再支持
    USE DB1
    SELECT o.name, o.type_desc, p.name as referenced_name, p.type_desc
    FROM sys.sql_dependencies d
    INNER JOIN sys.objects o
        ON d.object_id = o.object_id
    INNER JOIN sys.objects p
        ON d.referenced_major_id = p.object_id
    复制代码

    注意:和sysdepends, sp_depends一样,sys.sql_dependencies只能检查当前数据库对象的引用/被引用,对于跨数据库对象依赖关系,无法检查。

     

    三. SQL Server 2008后依赖关系查询

    复制代码
    --从SQL Server 2008开始用的系统视图
    USE DB1
    SELECT o.name, o.type_desc, p.name as referenced_name, p.type_desc
    FROM sys.sql_expression_dependencies d
    INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
    INNER JOIN sys.objects p
        ON d.referenced_id = p.object_id
    
    USE DB1
    --从SQL Server 2008开始用的系统函数,引用我的对象
    SELECT * FROM sys.dm_sql_referencing_entities('dbo.V1','OBJECT')
    --从SQL Server 2008开始用的系统函数,被我引用的对象
    SELECT * FROM sys.dm_sql_referenced_entities('dbo.SP1','OBJECT')
    
    USE DB2
    --从SQL Server 2008开始用的系统函数,引用我的对象
    SELECT * FROM sys.dm_sql_referencing_entities('dbo.SP2','OBJECT')
    --从SQL Server 2008开始用的系统函数,被我引用的对象
    SELECT * FROM sys.dm_sql_referenced_entities('dbo.SP2','OBJECT')
    复制代码

    注意:

    (1) sys.sql_expression_dependencies及这两个新增函数,都可以检查当前数据库中跨数据库,跨服务器引用的对象,但当前数据库对象被跨数据库,跨服务器引用,无法检查;

    (2) 新增的2个系统函数,可以更方便的检查引用和被引用,但对象名要完整,必须包含schema name,否则无法返回正确结果;

    (3) sys.dm_sql_referenced_entities 还可以查看被数据库/服务器DDL触发器引用的对象;

    SELECT * FROM sys.dm_sql_referenced_entities ('ddl_database_trigger_name', 'DATABASE_DDL_TRIGGER');

    (4) sys.dm_sql_referencing_entities 还可以查看引用了类型/分区函数等的对象。

     

    四. 无法查明的依赖关系

    1. 跨数据库/服务器对象

    上面提到从SQL Server 2008开始,跨数据库,跨服务器引用的对象,已经可以查询;

    但是写法上要稍微调整下,因为当前数据库中,并没有其他数据库对象的object_id,所以不能按照object_id来关联。改动后脚本如下:

    复制代码
    USE DB1
    SELECT schema_name(o.schema_id) as schema_name, o.name as object_name, o.type_desc, 
           d.referenced_server_name, d.referenced_database_name, isnull(d.referenced_schema_name,'dbo') as referenced_schema_name, d.referenced_entity_name
    FROM sys.sql_expression_dependencies d
    INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
    复制代码

    注意:跨数据库/跨服务器对象的引用,仅能检查3部分/4部分名称格式的对象引用,即如:server_name.db_name.schema_name.object_name格式,对于OPENROWSET, OPENQUERY, OPENDATASOURCE的引用并不记录。

     

    2. 临时对象

    对于存储过程中用到的临时表,只能检查到create table创建的非#开头临时表,并且用函数检查还会报错,因为表事先并不存在。

    复制代码
    if OBJECT_ID('SP5','P') is not null
        drop proc SP5
    GO
    create proc SP5
    as
    select * into #temp from sys.objects
    select * into _temp from sys.objects
    select getdate()
    
    create table #t (id int)
    insert into #t select 100
    
    if OBJECT_ID('_t','U') is not null
        drop proc _t
    create table _t (id int)
    insert into _t select 100
    GO
    复制代码
    复制代码
    USE DB1
    --只能检查到create table创建的非#临时表
    SELECT schema_name(o.schema_id) as schema_name, o.name as object_name, o.type_desc, 
           d.referenced_server_name, d.referenced_database_name, isnull(d.referenced_schema_name,'dbo') as referenced_schema_name, d.referenced_entity_name
    FROM sys.sql_expression_dependencies d
    INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
    
    --并且用函数检查还会报错,因为表事先并不存在
    select * from sys.dm_sql_referenced_entities('dbo.SP5','OBJECT');
    /*
    Msg 2020, Level 16, State 1, Line 4
    The dependencies reported for entity "dbo.SP5" might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity.  Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.
    */
    复制代码

     

    3. 动态SQL里引用的对象

    复制代码
    use DB1
    GO
    if OBJECT_ID('T2','U') is not null
        drop table T2
    GO
    create table T2(id int);
    GO
    if OBJECT_ID('SP6','P') is not null
        drop proc SP6
    GO
    create proc SP6
    as
    exec('select * from T1')
    
    declare @SQL nvarchar(max)
    set @SQL = N'select * from T2'
    exec sp_executesql @SQL
    exec (@SQL)
    GO
    复制代码
    复制代码
    USE DB1
    --无论系统视图/函数,都查不到
    SELECT schema_name(o.schema_id) as schema_name, o.name as object_name, o.type_desc, 
           d.referenced_server_name, d.referenced_database_name, isnull(d.referenced_schema_name,'dbo') as referenced_schema_name, d.referenced_entity_name
    FROM sys.sql_expression_dependencies d
    INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
    
    --无论系统视图/函数,都查不到
    select * from sys.dm_sql_referenced_entities('dbo.SP6','OBJECT');
    复制代码

    动态SQL里引用的对象,无论系统视图/函数,都查不到;也许只能试试查可编程对象的文本定义:

    复制代码
    --ANSI SQL标准里定义的INFORMATION_SCHEMA对象
    select * from INFORMATION_SCHEMA.ROUTINES 
    where ROUTINE_DEFINITION like '%T2%'
    
    --SQL Server 2000沿用下来的可编程对象文本定义
    select * from syscomments
    where text like '%T2%'
    
    --SQL Server 2005开始的可编程对象文本定义
    select * from sys.sql_modules 
    where definition like '%T2%'
    复制代码

     

    注意:这种方法,对于hard coding的对象名,非常好用,但是,

    (1) 有时动态SQL里的对象名称并不是hard coding,所以也不一定能找到;比如:

    EXEC('SELECT * FROM dbo.table' + '_name') 
    EXEC('SELECT * FROM ' + @table)

    (2) 另外一些书写不严格的SQL,也无法定位到对象名,比如:

    SELECT * FROM dbo . table_name --这语法竟然也能通过
    SELECT * FROM dbo.table_name_2 --名字只是部分类似,table_name_2不是table_name

     

    4. 延迟名称解析

    如果被引用的数据库对象,在后面创建,那么用2000或者2005的方式去检查,会出现延迟名称解析(deferred name resolution),用2008后的方式,已经没有这个问题。

    复制代码
    use DB2
    GO
    if OBJECT_ID('T3','U') is not null
        drop table T3
    GO
    create table T3(id int);
    GO
    
    --引用的SP_1st后创建
    if OBJECT_ID('SP_2nd','P') is not null
        drop proc SP_2nd
    GO
    create proc SP_2nd
    as
    exec SP_1st
    GO
    
    if OBJECT_ID('SP_1st','P') is not null
        drop proc SP_1st
    GO
    create proc SP_1st
    as
    select * from T3
    GO
    复制代码
    复制代码
    --出现延迟名称解析(deferred name resolution): 存储过程SP_2nd的引用对象,无法获取到
    USE DB2
    SELECT o.name, o.xtype, p.name as referenced_name, p.xtype
    FROM sysdepends d
    INNER JOIN sysobjects o
        ON d.id = o.id
    INNER JOIN sysobjects p
        ON d.depid = p.id
    
    exec sp_depends 'SP_1st'
    exec sp_depends 'SP_2nd'
    
    USE DB2
    SELECT o.name, o.type_desc, p.name as referenced_name, p.type_desc
    FROM sys.sql_dependencies d
    INNER JOIN sys.objects o
        ON d.object_id = o.object_id
    INNER JOIN sys.objects p
        ON d.referenced_major_id = p.object_id
    
    --刷新对象定义,可以解决
    exec sp_refreshsqlmodule 'SP_2nd'
    --如果是视图,也可以这样刷新
    exec sp_refreshview 'view_name'
    
    --使用2008后的系统视图,没有这个问题,它同时保存了引用对象的名称,object_id可先置为NULL
    USE DB2
    SELECT schema_name(o.schema_id) as schema_name, o.name as object_name, o.type_desc, 
           d.referenced_server_name, d.referenced_database_name, isnull(d.referenced_schema_name,'dbo') as referenced_schema_name, d.referenced_entity_name
    FROM sys.sql_expression_dependencies d
    INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
    复制代码

    注意:新的视图虽然解决了延迟名称解析的问题,但也带来了新问题,如果引用的对象一直未被创建,或者创建后被重名命/删除,这条依赖关系仍然存在。

     

    五. 如何获取多层嵌套引用的对象

    有时一个对象下会多层嵌套引用数据库对象,尤其是视图/存储过程等的嵌套调用,在某些场景下获取所有嵌套调用的对象很有用,比如:要更新某个存储过程下所有引用到的表上的统计信息。

    复制代码
    use DB2
    GO
    create table dbo.table2(c2 int)
    GO
    
    create proc dbo.sp12
    as
    select * from table2
    GO
    
    use DB1
    GO
    
    create table dbo.table1(c1 int)
    GO
    
    create view dbo.view1 
    as 
    select * from dbo.table1
    GO
    
    create view dbo.view2 
    as 
    select * from dbo.view1
    GO
    
    create proc dbo.sp11
    as
    select * from dbo.view2
    GO
    
    create proc dbo.sp13
    as 
    exec dbo.sp11
    exec DB2.dbo.sp12
    GO
    复制代码
    复制代码
    use DB2
    GO
    declare @entity_name varchar(512)
    set @entity_name = 'dbo.sp13'
    
    ;with tmp
    as
    (
    SELECT *
    FROM sys.sql_expression_dependencies d
    WHERE d.referencing_id = object_id(@entity_name)
    union all
    SELECT d.*
    FROM sys.sql_expression_dependencies d
    INNER JOIN tmp t
       ON t.referenced_id = d.referencing_id
    )
    --select * from tmp
    SELECT schema_name(o.schema_id) as schema_name, o.name as object_name, o.type_desc, 
           d.referenced_server_name, d.referenced_database_name, isnull(d.referenced_schema_name,'dbo') as referenced_schema_name, d.referenced_entity_name
      FROM tmp d
     INNER JOIN sys.objects o
        ON d.referencing_id = o.object_id
     -- LEFT JOIN sys.objects ro
     --   ON d.referenced_id = ro.object_id
     --WHERE ro.type_desc = 'USER_TABLE' or ro.type_desc is null
    复制代码

    注意:

    (1) 最后注释的几行脚本,限制用来获取所有被引用到的表,可根据需要调整;

    (2) 跨数据库/服务器引用的对象,如果不是最后一层,还得切换到对应的数据库/服务器再运行此脚本。

     

    小结:

    1. 查看被哪些对象引用,sys.sql_expression_dependencies,sys.dm_sql_referencing_entities, sys.sql_modules,无论哪种方式都查不到被跨数据库引用;

    2. 查看引用了哪些对象,sys.sql_expression_dependencies,sys.dm_sql_referenced_entities,都可以查到跨数据库引用的对象,如果查看嵌套调用的对象,还是递归查询sys.sql_expression_dependencies比较直接。


    源文:http://www.cnblogs.com/seusoftware/p/4858115.html

    展开全文
  • 介绍如何通过 Oracle 数据字典查看视图、序列、存储过程/函数、程序包、触发器、同义词、计划任务以及对象之间的依赖关系等信息。
  • 本篇只涉及表被其他数据库对象引用,不涉及外键,想寻找外键的,自己查看下面附有的链接。 首先有下列几种方式: 1、plsql工具 ; 点击工具,找到 查找数据库对象 最后进入到查找页面 ...
  • 摘要:GaussDB(DWS)是从Postgres演进过来的,像Postgres一样,如果表被视图引用的话,特定场景下,部分DDL操作是不能直接执行的。 背景说明 GaussDB(DWS)是从Postgres演进过来的,像Postgres一样,如果表被视图...
  • 这些对象之间是通过一定的方式联系一起的,应用程序设计中,时常需要通过这些对象之间的关系来实现文档、视图、框架类对象、应用程序类对象间相互引用和调用。如下:  1,视图类对文档类的使用  视图类...
  • 13. 查看数据库对象间的依赖关系

    千次阅读 2015-10-07 14:34:42
    SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同。 父子关系对象,不通过依赖关系来查询,比如: 1. 外键关系 黄色别墅http://www.326dy.com/  ...
  • 转自CSDN帖子:https://bbs.csdn.net/topics/120022910sp_depends联机帮助:显示有关数据库对象依赖关系的信息,例如:依赖于表或视图视图和过程,以及视图或过程所依赖的表和视图。不报告对当前数据库以外对象的...
  • Android视图SurfaceView的实现原理分析

    万次阅读 多人点赞 2013-03-16 16:57:30
    Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以一个独立的线程中进行绘制。又由于不会...
  • 对数据库视图view的理解

    万次阅读 2015-11-02 11:01:42
    首先解释什么是视图视图其实就是一条查询sql语句...视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中
  • oracle数据库----内嵌视图

    千次阅读 2017-09-06 18:40:54
    关系视图是数据库对象,创建关系视图实际是对查询定义可重用的需求。但有时,查询定义并不会被重用。此时,创建关系视图便不再适宜------过多的关系视图势必增加数据库的维护成本。oracle提供了内嵌视图来解决这一...
  • SQL 存储过程和视图有什么关系

    千次阅读 2007-07-02 12:55:00
    Link: http://www.haoad.net/Info/13426.Html个人觉得yykele的回答有很不够的地方,“和视图没什么关系”是不可能。 首写两者都是SQL的数据对象 再次并且写法也很相似。 最重要的是服务器的存储和运行过程都几乎是...
  • 对象关系映射

    万次阅读 2007-04-20 19:51:00
    作者:林学鹏ORM的全称是Object Relational Mapping,即对象关系映射。...ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一
  • sql视图处理复杂的数据查询关系

    千次阅读 2011-08-20 21:32:20
    这次辅助教务系统那块的时候,我做的一个页面是对单个老师和整个学院老师的工作量查询,这个操作设计到了三个本数据库中的表和一个不同数据库中的一个教师信息表,如果用普通的sql语句是非常难实现的,由于我刚...
  • [置顶] UML建模语言入门-视图,事物,关系,通用机制 http://blog.csdn.net/shulianghan/article/details/16880717 分类: UML 2013-12-01 00:16 5805人阅读 评论(7) 收藏 举报 UML架构视图图通用机制 目录(?)...
  • SQL视图查询详解

    万次阅读 2015-12-25 19:48:53
     视图可以看作定义SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata.  视图简单的理解如下:    ...
  • 《Spring实战》的书中是包括6.3 使用Apache Tiles视图定义布局和6.4 使用Thymeleaf这两个小节的,但是考虑到平时开发使用的比较少,就不进行介绍了,感兴趣的小伙伴们可以自行学习。 上一章主要关注...
  • Sql Server 视图原理

    千次阅读 2014-01-24 15:24:56
    视图可以看作定义SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata.  视图简单的理解如下:    ...
  • Stripes视图框架内置Spring集成的使用

    千次阅读 2013-11-06 00:51:10
    Stripes视图框架内置Spring集成了的,项目中也遇到需要导入spring支持的jar包,这足以证明Stripes与Spring有着非同寻常的关系。 Spring注入Java Bean  我们需要将Spring beans或业务对象自动地注入到需要进行处理...
  • 【数据库】oracle数据库----内嵌视图

    千次阅读 2016-04-15 22:04:56
    关系视图是数据库对象,创建关系视图实际是对查询定义可重用的需求。但有时,查询定义并不会被重用。此时,创建关系视图便不再适宜------过多的关系视图势必增加数据库的维护成本。oracle提供了内嵌视图来解决这一...
  • 模型-视图 编程

    千次阅读 2016-07-20 23:43:18
    模型/视图 编程模型/视图编程简介QT包含了 item view 类,这些类,使用模型/视图架构来管理数据与数据呈现方式之间的关系。这种架构引入了功能的分离,给程序员带来了非常大的灵活性来自定义数据的展示,也提供了一...
  • mysql 视图

    千次阅读 2011-10-26 11:07:40
    视图是5.1版新加入的功能 什么时候使用视图呢?经常用到的查询,或较复杂的联合查询应当创立视图,这是会优化性 能的,还有就是涉及到权限管理方面,比如某表中的部分字段含有机密信息,不应当让低权限的用户访问到...
  • 改进服务端之通过POA策略实现持久化的对象引用 介绍-改进服务器 本节中,我们将改进之前写的简单服务器(第二篇)。我们要利用POA策略来创建具有持久化对象引用的对象。 创建POA时为其指定策略可以用于控制POA的...
  • IBM i系统对象和DB2对象的对应关系 i5OS对象 DB2对象 模式(Schema) 库(Libary) 表(Table) 物理文件(Physical File) 分区表(Partitioned Table) 多成员(Member)...
  • oracle视图原理以及dml操作视图限制

    千次阅读 2017-07-07 18:10:10
    oracle视图实际上就是封装sql语句,对外提供一个别名,使用者不需要关心复杂的sql,视图执行之后会将执行的结果当做一个表来使用,相当于一个虚拟的表,如果想在视图上进行DML的操作,创建时候有两个选项 ...
  • Android视图架构详解

    万次阅读 2016-04-17 15:13:52
     最近一直研究View的绘制相关的机制,发现需要补充一下Android View Architecture的相关知识,所以就特地研究了一下这方面的代码,写成本篇文章  为了节约你的时间,本篇文章内容大致如下: Activity,DecorView...
  • 窗口和视图是为iPhone应用程序构造用户界面的可视组件...虽然窗口和视图对象之间两个平台上有很多相似性,但是具体到每个平台上,它们的作用都有轻微的差别。 UIWindow的作用 和Mac OS X的应用程序有所不同,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,849
精华内容 40,339
关键字:

对象引用关系视图在哪查看