|
| 1 | +/* |
| 2 | +Author: Svetlana Golovko |
| 3 | +Source link: https://www.mssqltips.com/sqlservertip/4876/finding-sql-server-object-dependencies-for-synonyms/ |
| 4 | +*/ |
| 5 | + |
| 6 | +SET NOCOUNT ON; |
| 7 | + |
| 8 | +-- check if a database has synonyms to the objects in another database |
| 9 | +IF EXISTS (SELECT base_object_name |
| 10 | + FROM sys.synonyms |
| 11 | + WHERE base_object_name LIKE '%.%.%' |
| 12 | + AND LEFT (REPLACE(REPLACE(base_object_name ,'[',''),']',''), |
| 13 | + CHARINDEX('.', REPLACE(REPLACE(base_object_name ,'[',''),']',''))-1) <> DB_NAME() |
| 14 | + ) |
| 15 | +BEGIN |
| 16 | + |
| 17 | + DECLARE @sql NVARCHAR(MAX), |
| 18 | + @syn_name NVARCHAR(255), |
| 19 | + @db NVARCHAR(255), |
| 20 | + @dbid NVARCHAR(20), |
| 21 | + @objname NVARCHAR(255) |
| 22 | + |
| 23 | + CREATE TABLE #tempTbl ( syn_name NVARCHAR(255), |
| 24 | + syn_base_object NVARCHAR(255), |
| 25 | + syn_base_object_db NVARCHAR(255), |
| 26 | + nest_level SMALLINT |
| 27 | + ); |
| 28 | + |
| 29 | + DECLARE SYN_DB CURSOR FOR |
| 30 | + |
| 31 | + -- get list of synonyms to the objects in another database |
| 32 | + SELECT DISTINCT [name] AS SYN_NAME, |
| 33 | + LEFT (REPLACE(REPLACE(base_object_name ,'[',''),']',''), |
| 34 | + CHARINDEX('.', REPLACE(REPLACE(base_object_name ,'[',''),']',''))-1) AS DBNM, |
| 35 | + DB_ID(LEFT (REPLACE(REPLACE(base_object_name ,'[',''),']',''), |
| 36 | + CHARINDEX('.', REPLACE(REPLACE(base_object_name ,'[',''),']',''))-1)) AS DBID, |
| 37 | + RIGHT (REPLACE(REPLACE(base_object_name ,'[',''),']',''), |
| 38 | + CHARINDEX('.', reverse(REPLACE(REPLACE(base_object_name ,'[',''),']','')))-1) AS objectname |
| 39 | +FROM sys.synonyms |
| 40 | +WHERE base_object_name LIKE '%.%.%' |
| 41 | + AND LEFT (REPLACE(REPLACE(base_object_name ,'[',''),']',''), |
| 42 | + CHARINDEX('.', REPLACE(REPLACE(base_object_name ,'[',''),']',''))-1) <> DB_NAME() |
| 43 | + |
| 44 | + OPEN SYN_DB; |
| 45 | + |
| 46 | + FETCH NEXT FROM SYN_DB |
| 47 | + INTO @syn_name, @db, @dbid, @objname; |
| 48 | + |
| 49 | + WHILE @@FETCH_STATUS = 0 |
| 50 | + BEGIN |
| 51 | + |
| 52 | + SET @sql = ' |
| 53 | + WITH DepTree |
| 54 | + AS |
| 55 | + ( |
| 56 | + SELECT ''' + @db + ''' AS DBNAME, |
| 57 | + o.[name], |
| 58 | + o.[object_id] AS referenced_id , |
| 59 | + o.[name] AS referenced_name, |
| 60 | + o.[object_id] AS referencing_id, |
| 61 | + o.[name] AS referencing_name, |
| 62 | + 0 AS NestLevel |
| 63 | + FROM [' + @db + '].sys.objects o |
| 64 | + WHERE o.is_ms_shipped = 0 |
| 65 | +
|
| 66 | + UNION ALL |
| 67 | + |
| 68 | + SELECT ''' + @db + ''' AS DBNAME, |
| 69 | + r.[name], |
| 70 | + d1.referenced_id, |
| 71 | + OBJECT_NAME( d1.referenced_id,' + @dbid + ') , |
| 72 | + d1.referencing_id, |
| 73 | + OBJECT_NAME( d1.referencing_id,' + @dbid + ') , |
| 74 | + NestLevel + 1 |
| 75 | + FROM [' + @db + '].sys.sql_expression_dependencies d1 JOIN DepTree r |
| 76 | + ON d1.referenced_id = r.referencing_id |
| 77 | + ) |
| 78 | +
|
| 79 | + INSERT INTO #tempTbl |
| 80 | + SELECT ''' + @syn_name + ''' AS syn_name, |
| 81 | + ''' + @objname + ''' AS syn_base_object, |
| 82 | + ''' + @db + ''' AS syn_base_object_db, |
| 83 | + MAX(NestLevel) AS nest_level |
| 84 | + FROM DepTree |
| 85 | + WHERE referencing_name = ''' + @objname + ''' |
| 86 | + GROUP BY referenced_name, DBNAME, referencing_name |
| 87 | + ORDER BY MAX(NestLevel) DESC' |
| 88 | + |
| 89 | + EXECUTE (@sql); |
| 90 | + |
| 91 | + FETCH NEXT FROM SYN_DB |
| 92 | + INTO @syn_name, @db, @dbid, @objname; |
| 93 | + END |
| 94 | + |
| 95 | + CLOSE SYN_DB; |
| 96 | + DEALLOCATE SYN_DB; |
| 97 | + |
| 98 | +END; |
| 99 | + |
| 100 | +SELECT syn_name |
| 101 | + , syn_base_object |
| 102 | + , syn_base_object_db |
| 103 | + , MAX(nest_level) AS nest_level |
| 104 | +FROM #tempTbl |
| 105 | +GROUP BY syn_name, syn_base_object, syn_base_object_db |
| 106 | +-- comment out next line if you want to see all synonyms' dependent objects regardless the nest level |
| 107 | +HAVING MAX(nest_level) > 2; |
| 108 | + |
| 109 | +DROP TABLE #tempTbl; |
| 110 | + |
| 111 | +GO |
0 commit comments