Raj*_*Raj 13 sql t-sql sql-server sql-server-2008
SQL Server版本 - 2008 R2
我正在评估DMS解决方案,目的是接管维护.原始解决方案有一个中央数据库,其中包含与制造商有关的数据.它还为每个经销商提供了一个数据库,这意味着存在许多跨数据库依赖关系.
问题:
作为第一步,我建议彻底清理数据库,因此了解对象依赖关系(包括跨数据库依赖关系)至关重要.我尝试使用Red Gate的解决方案,但输出太大了.我想要的只是数据库中没有任何依赖关系的对象列表 - 它们既不依赖于其他对象,也不依赖于它们的任何对象.
这是我用来获取依赖项列表的脚本:
SELECT
DB_NAME() referencing_database_name,
OBJECT_NAME (referencing_id) referencing_entity_name,
ISNULL(referenced_schema_name,'dbo') referenced_schema_name,
referenced_entity_name,
ao.type_desc referenced_entity_type,
ISNULL(referenced_database_name,DB_NAME()) referenced_database_name
FROM sys.sql_expression_dependencies sed
JOIN sys.all_objects ao
ON sed.referenced_entity_name = ao.name
Run Code Online (Sandbox Code Playgroud)
我将创建一个表 - 依赖项 - 我将从每个数据库中插入此结果集.下一步,我还将创建另一个表 - AllObjects-,它将包含数据库中所有对象的列表.这是执行此操作的脚本:
SELECT
DB_NAME() DBName,
name,
type_desc
FROM sys.all_objects
WHERE type_desc IN
(
'VIEW',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_STORED_PROCEDURE',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'USER_TABLE',
'SQL_SCALAR_FUNCTION'
)
Run Code Online (Sandbox Code Playgroud)
现在,此表中的名称列表未出现在依赖项表的referenced_entity_name列中,但应该提供我正在查找的对象列表.
SELECT
AO.DBName,
AO.name,
AO.type_desc
FROM AllObjects AO
LEFT OUTER JOIN Dependencies D ON
D.referenced_database_name = AO.DBName AND
D.referenced_entity_name = AO.name AND
D.referenced_entity_type = AO.type_desc
WHERE
D.referenced_database_name IS NULL AND
D.referenced_entity_name IS NULL AND
D.referenced_entity_type IS NULL
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
提前致谢,
拉吉
Mil*_*dic 15
您可以将结果与以下脚本找到的结果进行比较.这是完整的文章
CREATE PROCEDURE [dbo].[get_crossdatabase_dependencies] AS
SET NOCOUNT ON;
CREATE TABLE #databases(
database_id int,
database_name sysname
);
INSERT INTO #databases(database_id, database_name)
SELECT database_id, [name]
FROM sys.databases
WHERE 1 = 1
AND [state] <> 6 /* ignore offline DBs */
AND database_id > 4; /* ignore system DBs */
DECLARE
@database_id int,
@database_name sysname,
@sql varchar(max);
CREATE TABLE #dependencies(
referencing_database varchar(max),
referencing_schema varchar(max),
referencing_object_name varchar(max),
referenced_server varchar(max),
referenced_database varchar(max),
referenced_schema varchar(max),
referenced_object_name varchar(max)
);
WHILE (SELECT COUNT(*) FROM #databases) > 0 BEGIN
SELECT TOP 1 @database_id = database_id,
@database_name = database_name
FROM #databases;
SET @sql = 'INSERT INTO #dependencies select
DB_NAME(' + convert(varchar,@database_id) + '),
OBJECT_SCHEMA_NAME(referencing_id,'
+ convert(varchar,@database_id) +'),
OBJECT_NAME(referencing_id,' + convert(varchar,@database_id) + '),
referenced_server_name,
ISNULL(referenced_database_name, db_name('
+ convert(varchar,@database_id) + ')),
referenced_schema_name,
referenced_entity_name
FROM ' + quotename(@database_name) + '.sys.sql_expression_dependencies';
EXEC(@sql);
DELETE FROM #databases WHERE database_id = @database_id;
END;
SET NOCOUNT OFF;
SELECT * FROM #dependencies;
Run Code Online (Sandbox Code Playgroud)
哦,MS 在使用 sys.sql_expression_dependencies 检测跨数据库依赖关系方面做出了很好的努力,但我以前见过它错过了一些东西。在您的情况下,我会找到一个缺少依赖项的示例,然后开始回溯:您是否从查询中删除了它?如果是这样,请修复您的查询。sys.sql_expression_dependencies 是否省略了某类依赖项?在什么条件下?是动态 SQL 的罪魁祸首吗?等等。
您还应该sp_refreshsqlmodule为 sys.sql_modules 中的每个对象运行,然后重新运行您的代码。它强制 SQL Server 刷新依赖项信息(尽其所能)。
现在,为了验证,设置跟踪并侦听事件 114,“审计架构对象访问事件”,以及存储过程和/或 RPC 调用的开始和完成事件。包括列DatabaseName,ParentName,ObjectName,ServerName,SPID和RequestID(对于支持MARS的连接)。也许还有其他一些人。“审计架构对象访问事件”在任何对象被访问时都会发生,因此在此跟踪运行时练习应用程序,然后使用 SPID + RequestId 整理数据并使用 sys.sql_expression_dependencies 将其与您的结果进行比较。如果跟踪数据中没有出现在您的依赖项数据中的任何内容,那么您就错过了一些东西。
| 归档时间: |
|
| 查看次数: |
17365 次 |
| 最近记录: |