【问题标题】:SQL Server, Generate scripts, unencrypted stored procedures onlySQL Server,仅生成脚本,未加密的存储过程
【发布时间】:2013-11-04 21:07:45
【问题描述】:

我有一个包含 3195 个存储过程的 SQL Server 数据库。大多数(大约 90%)的存储过程都是加密的(它是一个 3rd 方应用程序),但也有很多没有加密(后来由顾问添加)。

我需要大致了解顾问创建的未加密存储过程,然后应用修复程序,以便他们可以使用 UTC 时间。

我使用Generate Scripts 并仅选择存储过程,但失败了。我认为这是因为它尝试写出的第一个存储过程是加密的。有没有办法写出大约 300 个未加密的存储过程?

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    编辑:怎么样:

    SELECT
        sp.NAME,
        ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
    FROM
        sys.all_objects AS sp
        LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
        LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
    WHERE
        sp.type = 'P'
        AND SCHEMA_NAME(sp.schema_id)='dbo'
        AND ISNULL(smsp.definition, ssmsp.definition) IS NOT NULL
    

    加密的存储过程将有一个 NULL 定义。

    【讨论】:

    • 这很不错,但它只能用 management studio 写出每个 sproc 的前 4000 个字符:-(
    • 尝试将结果输出到文件。这应该超过限制
    • 当我尝试将其限制为 sproc 的 256 个字符时:-(
    • 通过调整管理工作室选项,我可以得到最多 4000 个字符的数字。
    • 好吧,我的错 - 系统视图 INFORMATION_SCHEMA.ROUTINES 将 ROUTINE_DEFINITION 列声明为 NVARCHAR(4000),因此有限制。我现在已经编辑了答案,因此它与 SQL 管理工作室的生成脚本功能基本相同。现在应该没有限制了!
    【解决方案2】:

    似乎使用 INFORMATION_SCHEMA 将返回的数据限制为 4000 个字符。请参阅 Mark Brittingham 对此问题的回答: How do I programmatically retrieve SQL Server stored procedure source that is identical to the source returned by the SQL Server Management Studio gui?

    我用他的建议写出存储过程: EXEC sp_HelpText '你的程序名'

    从 James S 的建议开始,并使用 Mark Brittingham 对另一个问题的回答,我将下面的 t-sql 放在一起。然后我将查询分析器设置为将结果输出为文本。下面的 SQL 不一定漂亮,但它可以完成工作。 它生成所有未加密的存储过程的列表,然后循环它们并将它们打印出来。

    DECLARE @routineName nvarchar(255)
    DECLARE cursorbob CURSOR FOR
    SELECT ROUTINE_NAME
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_DEFINITION IS NOT NULL
    
    OPEN cursorbob   
    FETCH NEXT FROM cursorbob INTO @routineName   
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
        EXEC sp_HelpText @routineName
    
        FETCH NEXT FROM cursorbob INTO @routineName
    END
    
    CLOSE cursorbob   
    DEALLOCATE cursorbob
    

    【讨论】:

      【解决方案3】:

      试试这个Decrypt Stored Procedure

      获取脚本,然后像这样Encrypt Stored Procedure再次加密存储过程

      【讨论】:

        猜你喜欢
        • 2021-05-02
        • 2013-05-06
        • 2010-09-08
        • 2016-07-07
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        相关资源
        最近更新 更多