用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...