CREATE PROCEDURE sys_decrypt2K
@objName varchar(50)
AS
DECLARE
@a nvarchar(4000),
@b nvarchar(4000),
@c nvarchar(4000),
@d nvarchar(4000),
@i int,
@t bigint,
@tablename varchar(255),
@trigtype varchar(6),
@type varchar(2)
BEGIN TRAN
IF EXISTS(SELECT id FROM syscomments WHERE id = object_id(@objName) and encrypted = 1)
AND EXISTS(SELECT name FROM dbo.sysobjects WHERE name = @objName and xtype in ('V','P','TR'))
BEGIN
SET @type=(select xtype from dbo.sysobjects where name = @objName)
SET @type=UPPER(@type)
END ELSE
BEGIN
ROLLBACK TRAN
RETURN
END
IF @type='TR'
BEGIN
SET @tablename=(SELECT sysobjects_1.name FROM dbo.sysobjects INNER JOIN
dbo.sysobjects sysobjects_1 ON dbo.sysobjects.parent_obj = sysobjects_1.id
WHERE (dbo.sysobjects.type = 'TR') AND (dbo.sysobjects.name = @objName))
SET @trigtype=(SELECT CASE WHEN dbo.sysobjects.deltrig > 0 THEN 'DELETE'
WHEN dbo.sysobjects.instrig > 0 THEN 'INSERT'
WHEN dbo.sysobjects.updtrig > 0 THEN 'UPDATE' END
FROM dbo.sysobjects INNER JOIN
dbo.sysobjects sysobjects_1 ON dbo.sysobjects.parent_obj = sysobjects_1.id
WHERE (dbo.sysobjects.type = 'TR') AND (dbo.sysobjects.name = @objName))
END
--get encrypted data
SET @a=(SELECT ctext FROM syscomments WHERE id = object_id(@objName))
SET @b=case @type
WHEN 'P' THEN 'ALTER PROCEDURE '+ @objName +' WITH ENCRYPTION AS '+REPLICATE('-', 4000-62)
WHEN 'V' THEN 'ALTER VIEW ' + @objName +' WITH ENCRYPTION AS SELECT dbo.dtproperties.* FROM dbo.dtproperties'+REPLICATE('-', 4000-150)
WHEN 'TR' THEN 'ALTER TRIGGER ' + @objName +' ON '+ @tablename+' WITH ENCRYPTION FOR '+@trigtype+' AS PRINT ''a'''+REPLICATE('-', 4000-150)
END
EXECUTE (@b)
--get encrypted bogus SP
SET @c=(SELECT ctext FROM syscomments WHERE id = object_id(@objName))
SET @b=case @type
WHEN 'P' THEN 'CREATE PROCEDURE '+ @objName +' WITH ENCRYPTION AS '+REPLICATE('-', 4000-62)
WHEN 'V' THEN 'CREATE VIEW ' + @objName +' WITH ENCRYPTION AS SELECT dbo.dtproperties.* FROM dbo.dtproperties'+REPLICATE('-', 4000-150)
WHEN 'TR' THEN 'CREATE TRIGGER ' + @objName +' ON '+ @tablename+' WITH ENCRYPTION FOR '+@trigtype+' AS PRINT ''a'''+REPLICATE('-', 4000-150)
END
--start counter
SET @i=1
--fill temporary variable
SET @d = replicate(N'A', (datalength(@a) / 2))
--loop
WHILE @i<=datalength(@a)/2
BEGIN
--xor original+bogus+bogus encrypted
SET @d = stuff(@d, @i, 1, NCHAR(UNICODE(substring(@a, @i, 1)) ^
(UNICODE(substring(@b, @i, 1)) ^
UNICODE(substring(@c, @i, 1)))))
SET @i=@i+1
END
--drop original SP
IF @type='P'
EXECUTE ('DROP PROCEDURE '+ @objName)
ELSE IF @type='V'
EXECUTE ('DROP VIEW '+ @objName)
ELSE IF @type='TR'
EXECUTE ('DROP TRIGGER '+ @objName)
--remove encryption
--try to preserve case
SET @d=REPLACE((@d),'WITH ENCRYPTION', '')
SET @d=REPLACE((@d),'With Encryption', '')
SET @d=REPLACE((@d),'with encryption', '')
IF CHARINDEX('WITH ENCRYPTION',UPPER(@d) )>0
SET @d=REPLACE(UPPER(@d),'WITH ENCRYPTION', '')
--Replace SP
execute(@d)
COMMIT TRAN
GO
一次性加密所有存储过程和试图:
1、先将所有存储过程和试图生成SQL脚本,
2、EditPlus下进行替换
替换(选择匹配全字词)
as
为
WITH ENCRYPTION as
替换(正常模式)
WITH ENCRYPTION as
为
as
3.重新生成SQL脚本
----------------------------------------------------------
RE: 此方式一点也不适用:
1、假如我的视图是嵌套视图,存储过程中也有嵌套了其它存储过程.
请问你怎能保证视图、过程执行的先后顺序。
因为是嵌套视图,如不能保证先后顺序,运行SQL脚本时肯定要出错,
虽然多运行几次SQL脚本,错误就不再出现了,但此方式肯定不好了,
特别是SQL脚本不在SQL分析器中运行时。
2. 另处,你怎么去判断 WITH ENCRYPTION 将要插入视图、过程、触发器的位置。
仅判断AS后的字符,就插入 WITH ENCRYPTION,谁能做到?
3.........
谁能分解:select ctext from syscomments
一次性加密所有存储过程和试图,即可解决.