SQL 脚本整理 笔记

1.视图 存储过程 触发器 批量加密(With Encryption),单个解密 

在运行过程中自己找不到启用DAC 的地方,链接的时候需要在服务器名称前面添加ADMIN:,如本机是ADMIN:WP-PC 

另外加密后的对象可以用SQL prompt 直接单独查看,所以意义不是很大;防一些不懂的人吧,亲测可以使用;

网络上面有2000的,我自己测试在2008R2,作者本人在2012上面测试也是OK的

--加密存储过程  可以批量加密参数All 或者单个加密  已经加密的会有提示

Use master

Go

if object_ID('[sp_EncryptObject]') is not null

    Drop Procedure [sp_EncryptObject]

Go

create procedure sp_EncryptObject 

(

    @Object sysname='All'

)

as

/*

    当@Object=All的时候,对所有的函数,存储过程,视图和触发器进行加密

    调用方法:

    1. Execute sp_EncryptObject 'All'

    2. Execute sp_EncryptObject 'ObjectName'

*/

begin

    set nocount on

    

    if @Object <>'All'

    begin

        if not exists(select 1 from sys.objects a where a.object_id=object_id(@Object) And a.type in('P','V','TR','FN','IF','TF'))

        begin

            --SQL Server 2008

            raiserror 50001 N'无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。'



            --SQL Server 2012

            --throw 50001, N'无效的加密对象!加密对象必须是函数,存储过程,视图或触发器。',1  



            return

        end

        

        if exists(select 1 from sys.sql_modules a where a.object_id=object_id(@Object) and a.definition is null)

        begin

            --SQL Server 2008

            raiserror 50001 N'对象已经加密!'



            --SQL Server 2012

            --throw 50001, N'对象已经加密!',1  

            return

        end

    end

    

    declare @sql nvarchar(max),@C1 nchar(1),@C2 nchar(1),@type nvarchar(50),@Replace nvarchar(50)

    set @C1=nchar(13)

    set @C2=nchar(10)

    

    

    declare cur_Object 

        cursor for 

            select object_name(a.object_id) As ObjectName,a.definition 

                from sys.sql_modules a  

                    inner join sys.objects b on b.object_id=a.object_id

                        and b.is_ms_shipped=0

                        and not exists(select 1 

                                            from sys.extended_properties x

                                            where x.major_id=b.object_id

                                                and x.minor_id=0

                                                and x.class=1

                                                and x.name='microsoft_database_tools_support'

                                        )

                where b.type in('P','V','TR','FN','IF','TF')

                    and (b.name=@Object or @Object='All')

                    and b.name <>'sp_EncryptObject'

                    and a.definition is not null                    

                order by Case 

                            when b.type ='V' then 1 

                            when b.type ='TR' then 2

                            when b.type in('FN','IF','TF') then 3 

                            else 4 end,b.create_date,b.object_id

                

    open cur_Object

    fetch next from cur_Object into @Object,@sql

    while @@fetch_status=0

    begin

        

        Begin Try

                     

            if objectproperty(object_id(@Object),'ExecIsAfterTrigger')=0 set @Replace='As' ; else set @Replace='For ';

                

            if (patindex('%'+@C1+@C2+@Replace+@C1+@C2+'%',@sql)>0)

            begin

                set @sql=Replace(@sql,@C1+@C2+@Replace+@C1+@C2,@C1+@C2+'With Encryption'+@C1+@C2+@Replace+@C1+@C2)

            end

            else if(patindex('%'+@C1+@Replace+@C1+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C1+@Replace+@C1,@C1+'With Encryption'+@C1+@Replace+@C1)

            end

            else if(patindex('%'+@C2+@Replace+@C2+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C2+@Replace+@C2,@C2+'With Encryption'+@C2+@Replace+@C2)

            end

            else if(patindex('%'+@C2+@Replace+@C1+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C2+@Replace+@C1,@C1+'With Encryption'+@C2+@Replace+@C1)

            end

            else if(patindex('%'+@C1+@C2+@Replace+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C1+@C2+@Replace,@C1+@C2+'With Encryption'+@C1+@C2+@Replace)

            end

            else if(patindex('%'+@C1+@Replace+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C1+@Replace,@C1+'With Encryption'+@C1+@Replace)

            end

            else if(patindex('%'+@C2+@Replace+'%',@sql)>0)

            begin 

                set @sql=Replace(@sql,@C2+@Replace,@C2+'With Encryption'+@C2+@Replace)

            end

                    

            set @type =

                case 

                    when object_id(@Object,'P')>0 then 'Proc'

                    when object_id(@Object,'V')>0 then 'View'

                    when object_id(@Object,'TR')>0  then 'Trigger'

                    when object_id(@Object,'FN')>0 or object_id(@Object,'IF')>0 or object_id(@Object,'TF')>0 then 'Function'

                end

            set @sql=Replace(@sql,'Create '+@type,'Alter '+@type)

            

            Begin Transaction

            exec(@sql)            

            print N'已完成加密对象('+@type+'):'+@Object            

            Commit Transaction

            

        End Try

        Begin Catch

            Declare @Error nvarchar(2047)

            Set @Error='Object: '+@Object+@C1+@C2+'Error: '+Error_message()





            Rollback Transaction          

            print @Error

            print @sql   

        End Catch

                    

        fetch next from cur_Object into @Object,@sql

        

    end

    

    close cur_Object

    deallocate cur_Object        

end

 

Go

exec sp_ms_marksystemobject 'sp_EncryptObject' --标识为系统对象

go
View Code

--解密存储过程

Use master

Go

if object_ID('[sp_DecryptObject]') is not null

    Drop Procedure [sp_DecryptObject]

Go

create procedure sp_DecryptObject 

(

    @Object sysname,    --要解密的对象名:函数,存储过程,视图或触发器

    @MaxLength int=4000 --评估内容的长度

)

as

set nocount on

/* 1. 解密 */

 

if not exists(select 1 from sys.objects a where a.object_id=object_id(@Object) And a.type in('P','V','TR','FN','IF','TF'))

begin

    --SQL Server 2008

    raiserror 50001 N'无效的对象!要解密的对象必须是函数,存储过程,视图或触发器。' 



    --SQL Server 2012

    --throw 50001, N'无效的对象!要解密的对象必须是函数,存储过程,视图或触发器。',1   

    return

end

 

if exists(select 1 from sys.sql_modules a where a.object_id=object_id(@Object) and a.definition is not null)

begin

    --SQL Server 2008

    raiserror 50001 N'对象没有加密!' 



    --SQL Server 2012

    --throw 50001, N'无效的对象!要解密的对象必须是函数,存储过程,视图或触发器。',1 

    return

end

 

declare  @sql nvarchar(max)                --解密出来的SQL语句

        ,@imageval nvarchar(max)        --加密字符串

        ,@tmpStr nvarchar(max)            --临时SQL语句

        ,@tmpStr_imageval nvarchar(max) --临时SQL语句(加密后)

        ,@type char(2)                    --对象类型('P','V','TR','FN','IF','TF')

        ,@objectID int                    --对象ID

        ,@i int                            --While循环使用

        ,@Oject1 nvarchar(1000)

 

set @objectID=object_id(@Object)

set @type=(select a.type from sys.objects a where a.object_id=@objectID)

 

declare @Space4000 nchar(4000)

set @Space4000=replicate('-',4000)

 

/*

@tmpStr 会构造下面的SQL语句

-------------------------------------------------------------------------------

alter trigger Tr_Name on Table_Name with encryption for update as return /**/

alter proc Proc_Name with encryption  as select 1 as col /**/

alter view View_Name with encryption as select 1 as col /**/

alter function Fn_Name() returns int with encryption as begin return(0) end/**/

*/

set @Oject1=quotename(object_schema_name(@objectID))+'.'+quotename(@Object)

set @tmpStr=

        case     

            when @type ='P ' then N'Alter Procedure '+@Oject1+' with encryption as select 1 as column1 '

            when @type ='V ' then N'Alter View '+@Oject1+' with encryption as select 1 as column1 '

            when @type ='FN' then N'Alter Function '+@Oject1+'() returns int with encryption as begin return(0) end '

            when @type ='IF' then N'Alter Function '+@Oject1+'() returns table with encryption as return(Select a.name from sys.types a) '

            when @type ='TF' then N'Alter Function '+@Oject1+'() returns @t table(name nvarchar(50)) with encryption as begin return end '

            else 'Alter Trigger '+@Oject1+'on '+quotename(object_schema_name(@objectID))+'.'+(select Top(1) quotename(object_name(parent_id)) from sys.triggers a where a.object_id=@objectID)+' with encryption for update as return ' 

        end        

 

    

set @tmpStr=@tmpStr+'/*'+@Space4000

set @i=0

while @i < (ceiling(@MaxLength*1.0/4000)-1)

begin

    set @tmpStr=@tmpStr+ @Space4000

    Set @i=@i+1

end

set @tmpStr=@tmpStr+'*/'

 

------------

set @imageval =(select top(1) a.imageval from sys.sysobjvalues a where a.objid=@objectID and a.valclass=1)

 

begin tran

exec(@tmpStr)

set @tmpStr_imageval =(select top(1) a.imageval from sys.sysobjvalues a where a.objid=@objectID and a.valclass=1)

 

rollback tran

 

-------------

set @tmpStr=stuff(@tmpStr,1,5,'create')

set @sql=''

set @i=1

while @i<= (datalength(@imageval)/2)

begin

    set @sql=@sql+isnull(nchar(unicode(substring(@tmpStr,@i,1)) ^ unicode(substring(@tmpStr_imageval,@i,1))^unicode(substring(@imageval,@i,1)) ),'')

    Set @i+=1

end

 

/* 2. 列印 */

 

 

declare @patindex int    

while @sql>''

begin

    

    set @patindex=patindex('%'+char(13)+char(10)+'%',@sql)

    if @patindex >0

    begin

        print substring(@sql,1,@patindex-1)

        set @sql=stuff(@sql,1,@patindex+1,'')

    end    

    else 

    begin

        set @patindex=patindex('%'+char(13)+'%',@sql)

        if @patindex >0

        begin

            print substring(@sql,1,@patindex-1)

            set @sql=stuff(@sql,1,@patindex,'')

        end

        else

        begin

            set @patindex=patindex('%'+char(10)+'%',@sql)

            if @patindex >0

            begin

                print substring(@sql,1,@patindex-1)

                set @sql=stuff(@sql,1,@patindex,'')

            end        

            else

            begin

                print @sql

                set @sql=''

            end    

        end        

    end

        

end

 

Go

exec sp_ms_marksystemobject 'sp_DecryptObject' --标识为系统对象

go
View Code

--解密测试

CREATE  PROC sp_SplitResult2

With Encryption

As

    BEGIN 

    SELECT * FROM dbo.Orders

    END 

    

  exec sp_DecryptObject sp_SplitResult2

http://www.cnblogs.com/lyhabc/p/3384906.html

http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html

下面的是利用工具批量解密 网址 都是华仔的

http://www.cnblogs.com/lyhabc/p/3505677.html

2.

以游标技术,列举出所有学生的名单,包括学生姓名、选择的课程的数量,SQL题目

-- 前面先取一次数据,后面再调用赋值的变量 在循环里面利用赋值的变量 去到课程表里面找所选课程数量

--假设有2个表 tStudent(sno,name )  tCourse(sno CourseName)

--假设有2个表 tStudent(sno,name )  tCourse(sno CourseName)

IF OBJECT_ID('tStudent') > 0

    DROP TABLE tStudent

IF OBJECT_ID('tCourse') > 0

    DROP TABLE tCourse

 

CREATE TABLE tStudent

    (

      sno VARCHAR(10) ,

      name NVARCHAR(10)

    )

CREATE TABLE tCourse

    (

      sno VARCHAR(10) ,

      CourseName NVARCHAR(10)

    )

 

INSERT  dbo.tStudent

        ( sno, name )

VALUES  ( '001', -- fstudentno - varchar(10)

          N'小张'  -- fname - nvarchar(10)

          )

           

INSERT  dbo.tStudent

        ( sno, name )

VALUES  ( '002', -- fstudentno - varchar(10)

          N'小李'  -- fname - nvarchar(10)

          )

INSERT  dbo.tStudent

        ( sno, name )

VALUES  ( '003', -- fstudentno - varchar(10)

          N'小如'  -- fname - nvarchar(10)

          )

           

INSERT  dbo.tCourse

        ( sno, CourseName )

VALUES  ( '001', -- sno - varchar(10)

          N'英语'  -- CourseName - nvarchar(10)

          )

INSERT  dbo.tCourse

        ( sno, CourseName )

VALUES  ( '001', -- sno - varchar(10)

          N'语文'  -- CourseName - nvarchar(10)

          )

           

INSERT  dbo.tCourse

        ( sno, CourseName )

VALUES  ( '002', -- sno - varchar(10)

          N'语文'  -- CourseName - nvarchar(10)

          )
View Code

--建立存储过程 里面使用游标遍历所有学生

Create  PROC GetInfo

AS

    BEGIN

     

 

        DECLARE curName CURSOR FAST_FORWARD

        FOR

            ( SELECT DISTINCT

                        *

              FROM      dbo.tStudent

            )

        OPEN curName

        DECLARE @sno VARCHAR(10) ,

            @name NVARCHAR(10) ,

            @coursenum INT 

        DECLARE @tb TABLE

            (

              name NVARCHAR(10) ,

              coursenum INT

            )

 

        FETCH NEXT FROM curName

        INTO @sno, @name

 

        SELECT  @coursenum = ISNULL(COUNT(DISTINCT CourseName), 0)

        FROM    tCourse

        WHERE   sno = @sno

 

        --INSERT  @tb

        --        SELECT  @name ,

        --                @coursenum

 

 

        WHILE @@FETCH_STATUS = 0

            BEGIN

             

                SELECT  @coursenum = ISNULL(COUNT(DISTINCT CourseName), 0)

                FROM    tCourse

                WHERE   sno = @sno

                 

                INSERT  @tb

                        SELECT  @name ,

                                @coursenum

                                 

                FETCH NEXT FROM curName

INTO @sno, @name

            END 

 

        SELECT  *

        FROM    @tb

 

        CLOSE curName

        DEALLOCATE curName

    END
View Code

--  查看执行结果

 exec GetInfo

 

你可能感兴趣的:(sql)