用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - sql代码库

数据库对象关系研究,数据库中的表、视图、存储过程和用户定义函数之间的关系

2017-05-07 作者: 小章举报

[sql]代码库

USE [DatabaseAnalysis]
GO

/*
--SQL Server数据库对象表
CREATE TABLE [dbo].[SqlObject](
	[sqlObjectType] [varchar](20) NOT NULL,
	[sqlObjectName] [sysname] NOT NULL,
	[updated] [bit] NOT NULL
 CONSTRAINT [PK_SqlObject] PRIMARY KEY CLUSTERED 
(
	[sqlObjectName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--SQL Server数据库对象关系表
CREATE TABLE [dbo].[SqlObjectRelation](
	[subSqlObjectType] [varchar](20) NOT NULL,
	[subSqlObjectName] [sysname] NOT NULL,
	[sqlObjectType] [varchar](20) NOT NULL,
	[sqlObjectName] [sysname] NOT NULL,
	[folderOrPath] [nvarchar](1000) NOT NULL,
	[updated] [bit] NOT NULL,
 CONSTRAINT [PK_SqlObjectRelation] PRIMARY KEY NONCLUSTERED 
(
	[subSqlObjectName] ASC,
	[sqlObjectName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--SQL Server数据库对象名称包含关系表
CREATE TABLE [dbo].[SqlSubStringObject](
	[sqlSubStringObjectName] [sysname] NOT NULL,
	[sqlObjectName] [sysname] NOT NULL,
	[updated] [bit] NOT NULL,
 CONSTRAINT [PK_SqlSubStringObject] PRIMARY KEY CLUSTERED 
(
	[sqlSubStringObjectName] ASC,
	[sqlObjectName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--SQL Server数据库现有对象关系视图
CREATE VIEW [dbo].[V_SqlObjectRelation]
AS
SELECT [subSqlObjectType],
	[subSqlObjectName],
	[sqlObjectType],
	[sqlObjectName],
	[folderOrPath]
FROM [dbo].[SqlObjectRelation]
WHERE [updated] = 1

GO
*/
--获取数据库中所有的表、视图、存储过程和用户定义函数,更新数据库对象表
UPDATE [dbo].[SqlObject]
SET [updated] = 0
WHERE [updated] = 1;

MERGE INTO [dbo].[SqlObject] AS T
USING (
	SELECT [TABLE_TYPE] [sqlObjectType],
		[TABLE_NAME] [sqlObjectName]
	FROM [BugNET].INFORMATION_SCHEMA.TABLES
	
	UNION ALL
	
	SELECT 'StoredProcedure',
		sp.NAME
	FROM [BugNET].sys.all_objects AS sp
	WHERE (
			(
				sp.type = N'P'
				OR sp.type = N'RF'
				OR sp.type = N'PC'
				)
			AND (
				CAST(CASE 
						WHEN sp.is_ms_shipped = 1
							THEN 1
						WHEN (
								SELECT major_id
								FROM [BugNET].sys.extended_properties
								WHERE major_id = sp.object_id
									AND minor_id = 0
									AND class = 1
									AND NAME = N'microsoft_database_tools_support'
								) IS NOT NULL
							THEN 1
						ELSE 0
						END AS BIT) = 0
				)
			)
	
	UNION ALL
	
	SELECT 'UserDefinedFunction',
		udf.NAME
	FROM [BugNET].sys.all_objects AS udf
	WHERE (
			udf.type IN (
				'TF',
				'FN',
				'IF',
				'FS',
				'FT'
				)
			)
		AND CAST(CASE 
				WHEN udf.is_ms_shipped = 1
					THEN 1
				WHEN (
						SELECT major_id
						FROM sys.extended_properties
						WHERE major_id = udf.object_id
							AND minor_id = 0
							AND class = 1
							AND NAME = N'microsoft_database_tools_support'
						) IS NOT NULL
					THEN 1
				ELSE 0
				END AS BIT) = 0
	) AS S
	ON S.[sqlObjectName] = T.[sqlObjectName]
WHEN MATCHED
	THEN
		UPDATE
		SET T.[sqlObjectType] = S.[sqlObjectType],
			T.[updated] = 1
WHEN NOT MATCHED
	THEN
		INSERT
		VALUES (
			[sqlObjectType],
			[sqlObjectName],
			1
			);

--获取数据库对象名称之间包含关系,更新数据库对象名称包含关系表
UPDATE [dbo].[SqlSubStringObject]
SET [updated] = 0
WHERE [updated] = 1;

MERGE INTO [dbo].[SqlSubStringObject] T
USING (
	SELECT S2.[sqlObjectName] [sqlSubStringObjectName],
		S1.[sqlObjectName]
	FROM [DatabaseAnalysis].[dbo].[SqlObject] S1
	INNER JOIN [DatabaseAnalysis].[dbo].[SqlObject] S2 ON S1.[sqlObjectName] LIKE '%' + S2.[sqlObjectName] + '%'
		AND S1.[updated] = 1
		AND S2.[updated] = 1
		AND S1.[sqlObjectName] <> S2.[sqlObjectName]
	) S
	ON T.[sqlSubStringObjectName] = S.[sqlSubStringObjectName]
		AND T.[sqlObjectName] = S.[sqlObjectName]
WHEN MATCHED
	THEN
		UPDATE
		SET T.[updated] = 1
WHEN NOT MATCHED
	THEN
		INSERT
		VALUES (
			S.[sqlSubStringObjectName],
			S.[sqlObjectName],
			1
			);

UPDATE [dbo].[SqlObjectRelation]
SET [updated] = 0
WHERE [updated] = 1;

SELECT *
INTO #SqlObjectRelation
FROM (
	SELECT t.[sqlObjectType] [subSqlObjectType],
		t.[sqlObjectName] [subSqlObjectName],
		v.[sqlObjectType],
		v.[sqlObjectName],
		@@SERVERNAME + '\' + v.[sqlDatabaseName] + '\' + v.[sqlObjectSchema] + '.' + v.[sqlObjectName] [folderOrPath],
		[sqlObjectDefinition]
	FROM [dbo].[SqlObject] t
	INNER JOIN (
		SELECT 'VIEW' [sqlObjectType],
			[TABLE_NAME] [sqlObjectName],
			[TABLE_CATALOG] [sqlDatabaseName],
			[TABLE_SCHEMA] [sqlObjectSchema],
			[VIEW_DEFINITION] [sqlObjectDefinition]
		FROM [BugNET].INFORMATION_SCHEMA.VIEWS
		
		UNION ALL
		
		SELECT 'StoredProcedure',
			sp.NAME,
			'BugNET',
			SCHEMA_NAME(sp.schema_id),
			c.TEXT
		FROM [BugNET].sys.all_objects AS sp
		INNER JOIN [BugNET].dbo.syscomments c ON c.id = sp.object_id
			AND CASE 
				WHEN c.number > 1
					THEN c.number
				ELSE 0
				END = 0
		WHERE (
				sp.type = N'P'
				OR sp.type = N'RF'
				OR sp.type = N'PC'
				)
			AND (
				CAST(CASE 
						WHEN sp.is_ms_shipped = 1
							THEN 1
						WHEN (
								SELECT major_id
								FROM [BugNET].sys.extended_properties
								WHERE major_id = sp.object_id
									AND minor_id = 0
									AND class = 1
									AND NAME = N'microsoft_database_tools_support'
								) IS NOT NULL
							THEN 1
						ELSE 0
						END AS BIT) = 0
				)
		
		UNION ALL
		
		SELECT 'UserDefinedFunction',
			udf.NAME,
			'BugNET',
			SCHEMA_NAME(udf.schema_id),
			m.DEFINITION
		FROM [BugNET].[sys].[all_sql_modules] m
		INNER JOIN [BugNET].[sys].[all_objects] udf ON m.object_id = udf.object_id
		WHERE DEFINITION LIKE '%create function%'
			AND udf.type IN (
				'TF',
				'FN',
				'IF',
				'FS',
				'FT'
				)
			AND CAST(CASE 
					WHEN udf.is_ms_shipped = 1
						THEN 1
					WHEN (
							SELECT major_id
							FROM [BugNET].sys.extended_properties
							WHERE major_id = udf.object_id
								AND minor_id = 0
								AND class = 1
								AND NAME = N'microsoft_database_tools_support'
							) IS NOT NULL
						THEN 1
					ELSE 0
					END AS BIT) = 0
		) v ON v.[sqlObjectDefinition] LIKE '%' + t.[sqlObjectName] + '%'
		AND t.[updated] = 1
		AND t.[sqlObjectName] <> v.[sqlObjectName]
	) A

--更新数据库对象关系表
MERGE INTO [dbo].[SqlObjectRelation] T
USING (
	SELECT DISTINCT [subSqlObjectType],
		[subSqlObjectName],
		[sqlObjectType],
		[sqlObjectName],
		[folderOrPath]
	FROM #SqlObjectRelation
	) S
	ON S.[subSqlObjectName] = T.[subSqlObjectName]
		AND S.[sqlObjectName] = T.[sqlObjectName]
		AND S.[folderOrPath] = T.[folderOrPath]
WHEN MATCHED
	THEN
		UPDATE
		SET T.[subSqlObjectType] = S.[subSqlObjectType],
			T.[sqlObjectType] = S.[sqlObjectType],
			T.[updated] = 1
WHEN NOT MATCHED
	THEN
		INSERT
		VALUES (
			S.[subSqlObjectType],
			S.[subSqlObjectName],
			S.[sqlObjectType],
			S.[sqlObjectName],
			S.[folderOrPath],
			1
			);

DECLARE @updated BIT,
	@subSqlObjectName SYSNAME,
	@sqlObjectName SYSNAME,
	@folderOrPath NVARCHAR(1000)

DECLARE curSqlObjectRelation CURSOR
FOR
SELECT [updated],
	[subSqlObjectName],
	[sqlObjectName],
	[folderOrPath]
FROM [dbo].[SqlObjectRelation]
FOR UPDATE OF [updated]

DECLARE @count SMALLINT

SELECT @count = 1

OPEN curSqlObjectRelation

FETCH NEXT
FROM curSqlObjectRelation
INTO @updated,
	@subSqlObjectName,
	@sqlObjectName,
	@folderOrPath

WHILE (@@fetch_status <> - 1)
BEGIN
	IF (@@fetch_status <> - 2)
	BEGIN
		IF (
				@updated = 1
				AND EXISTS (
					SELECT TOP 1 1
					FROM [dbo].[SqlSubStringObject]
					WHERE [sqlSubStringObjectName] = @subSqlObjectName
					)
				)
		BEGIN
			DECLARE @sqlObjectDefinition NVARCHAR(4000),
				@sqlParentObjectName SYSNAME

			SET @sqlObjectDefinition = ''

			IF (@subSqlObjectName = 'BugNet_ApplicationLog')
				SET @subSqlObjectName = @subSqlObjectName

			WHILE @sqlObjectDefinition IS NOT NULL
			BEGIN
				SET @sqlParentObjectName = ''
				SET @sqlObjectDefinition = (
						SELECT MIN([sqlObjectDefinition])
						FROM #SqlObjectRelation s
						WHERE s.[subSqlObjectName] = @subSqlObjectName
							AND s.[sqlObjectName] = @sqlObjectName
							AND s.[folderOrPath] = @folderOrPath
							AND s.[sqlObjectDefinition] > @sqlObjectDefinition
						)

				IF (@sqlObjectDefinition IS NOT NULL)
				BEGIN
					DECLARE @sqlObjectDefinition1 NVARCHAR(4000) = @sqlObjectDefinition

					WHILE @sqlParentObjectName IS NOT NULL
					BEGIN
						SET @sqlParentObjectName = (
								SELECT MIN([sqlObjectName])
								FROM [dbo].[SqlSubStringObject]
								WHERE [sqlSubStringObjectName] = @subSqlObjectName
									AND [sqlObjectName] > @sqlParentObjectName
								)

						IF (@sqlParentObjectName IS NOT NULL)
							SET @sqlObjectDefinition1 = REPLACE(@sqlObjectDefinition1, @sqlParentObjectName, '')
					END
				END

				IF (CHARINDEX(@subSqlObjectName, @sqlObjectDefinition1) = 0)
					UPDATE [dbo].[SqlObjectRelation]
					SET [updated] = 0
					WHERE [subSqlObjectName] = @subSqlObjectName
						AND [sqlObjectName] = @sqlObjectName
						AND [folderOrPath] = @folderOrPath
			END
		END
	END

	FETCH NEXT
	FROM curSqlObjectRelation
	INTO @updated,
		@subSqlObjectName,
		@sqlObjectName,
		@folderOrPath

	SELECT @count = @count + 1
END

CLOSE curSqlObjectRelation

DEALLOCATE curSqlObjectRelation
GO

DROP TABLE #SqlObjectRelation;

--显示数据库现有对象关系视图
SELECT [subSqlObjectType],
	[subSqlObjectName],
	[sqlObjectType],
	[sqlObjectName],
	[folderOrPath]
FROM [DatabaseAnalysis].[dbo].[V_SqlObjectRelation]
	/*
--开启clr enabled 选项
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE 

CREATE FUNCTION dbo.GetPackageContent ()
RETURNS NVARCHAR(4000)
AS
---sql c# clr 程序集文件名.类名.方法名
EXTERNAL NAME GetContentFromSSISPackage.UserDefinedFunctions.GetPackageContent
SELECT dbo.GetPackageContent()

*/


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...