SQL2005下怎么样批量加密所有的存储过程.一次性加密掉所有的存储过程

解决方案 »

  1.   

    DECLARE tb CURSOR LOCAL 
    FOR
    WITH P AS(
    SELECT 
    name = QUOTENAME(S.name) + N'.' + QUOTENAME(P.name),
    objname = P.name,
    M.definition,
    ProcHeader = LEFT(M.definition, CHARINDEX('AS', M.definition) + 1)
    FROM sys.procedures P, sys.sql_modules M, sys.schemas S
    WHERE P.object_id = M.object_id
    AND P.schema_id = S.schema_id
    AND P.is_ms_shipped = 0
    AND M.definition IS NOT NULL
    )
    SELECT
    sql1 = N'DROP PROC ' + name,
    sql2 = CASE
    WHEN ProcHeader LIKE N'%CREATE%PROC%' + objname + N'%WITH%AS%'
    THEN STUFF(definition, PATINDEX(N'%WITH%AS%', ProcHeader) + 4, 0, N' ENCRYPTION, ')
    WHEN ProcHeader LIKE N'%CREATE%PROC%' + objname + N'%FOR%REPLICATION %AS%'
    THEN STUFF(definition, PATINDEX(N'%FOR%REPLICATION %AS%', ProcHeader), 0, N' WITH ENCRYPTION ')
    ELSE STUFF(definition, PATINDEX(N'%AS%', definition), 0, N' WITH ENCRYPTION ')
    END,
    definition
    FROM P
    BEGIN TRY
    BEGIN TRAN
    OPEN tb
    DECLARE 
    @sql1 nvarchar(max),
    @sql2 nvarchar(max),
    @definition nvarchar(max)
    FETCH tb INTO @sql1, @sql2, @definition
    WHILE @@FETCH_STATUS = 0
    BEGIN
    EXEC(@sql1)
    EXEC(@sql2)
    PRINT(N'')
    PRINT(N'----------------------------------------------------')
    PRINT(N'-- old define --------------------------------------')
    PRINT(N'----------------------------------------------------')
    PRINT(@definition)
    PRINT('GO')
    FETCH tb INTO @sql1, @sql2, @definition
    END
    CLOSE tb
    DEALLOCATE tb
    COMMIT TRAN  -- 建议先注释掉此句,测试无误后再提交事务
    END TRY
    BEGIN CATCH
    IF XACT_STATE() <> 0
    ROLLBACK TRAN SELECT ERROR_NUMBER(), ERROR_MESSAGE()
    END CATCH
      

  2.   

    这个问题很有趣,但愿你加密前都保留了源码,否则就惨了我这里写个大概的步骤,谁有兴趣可以接着写全了1.先把所以存储过程的ID找到,插到临时表
    select object_id from sys.objects where type = 'P'2.用循环或者游标一个个找出存储过程的源码
    declare @tmp nvarhcar(max)
    select @tmp = defintion from sys.sql_modules where object_id = @id 3.找到 @tmp 中第一次出现 ' AS ' 的位置,注意AS前后有空格4.将 WITH ENCRYPTION 插入到 AS 前的位置,上一步已经找到是第几个字符了5.搜索 @tmp 将第一次出现的 CREATE 改成 ALTER6.执行这个 @tmp 现在没问题了吧,一个个执行循环结束全部都加密了charindex 和 substring 应该都会用吧