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

--解密存储过程

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

--解密测试

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)
          )

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

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

--  查看执行结果

exec GetInfo

时间: 2024-11-08 21:38:45

SQL 脚本整理 笔记的相关文章

MyBatis常用SQL语句整理笔记

最近使用Mybatis作为持久层框架,自然/动态sql写得也比较多了,最常见的就是在查询语句中使用if标签来动态地改变过滤条件. Mybatis强大特性之一就是它的动态sql,免除了拼接sql带来的各种麻烦. 在项目开发过程中,常见的和不常见的问题都有碰到过,所以在这总结一下. if choose(when,otherwise) trim(where,set) foreach 1.通常用于多条件组合查询 <select id="productId" parameterType=&

SQL脚本整理系列一 表分区

表分区的目的: 1.把历史数据放到另外一个表里面 可以提高查询效率 当然如果经常查询历史数据和新数据的合并结果集这样做就大大的不好了 2.通过把一个表放到不同的文件,不同的文件再存储到不同的磁盘列阵中,可以提高IO速度   CPU比硬盘快多了 3.提高可用性,一个磁盘坏了,另外一个磁盘上面的文件还能用 这个对我意义不大 4.便于备份 只需要做一个分区的备份就可以了,比如云服务端,数据量比较大的就4个表单,把这四个表放在一个文件里面这样每天备份基本不花什么时间,还原也比较方便,这4个表的数据丢了意

[笔记] 查询表记录空间占用情况SQL脚本

USE ExpressDB CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(50) , rowsinfo BIGINT , reserved VARCHAR(20) , datainfo VARCHAR(20) , index_size VARCHAR(20) , unused VARCHAR(20) ) --创建游标 DECLARE Info_cursor CURSOR FOR SELECT '[' + [name] + ']' FROM sys

linux下执行sql脚本链接整理

linux下执行sql脚本        :http://blog.csdn.net/huoyunshen88/article/details/11556951

SQL Server 2012笔记分享-54:数据库文件管理1

(一)添加文件 可以在线执行,不影响数据库使用 ,如图. 添加完成后,如图所示. 也可以通过脚本的形式来添加,如图. (二)删除文件 可以在线执行,不影响数据库使用 . 只有当文件中的实际使用空间为空时才能被成功执行 . (三)移动文件到不同的磁盘路径下 必须先将数据库脱机,将导致数据库暂时不可用 详情参考:http://msdn.microsoft.com/zh-cn/library/ms345483.aspx 若要将移动数据或日志文件作为计划的重定位的一部分,请执行下列步骤: 1. 运行以下

SQL Server 2012笔记分享-46:如何快速学习T-SQL语句

对于初学者来说,T-SQL语句的编写一直是个难题,初学者还是习惯使用图形界面来做相关的SQL方面的维护工作.但是在一个稍微复杂大型的SQL场景中,如果我们能够快速的掌握和理解SQL语句的编写和使用,那么会使我们的运维工作达到事半功倍的效果. 其实对于SQL server 2012来说,本身就提供了很多途径来帮助初学者获取日常管理任务的对应T-SQL脚本.下面我们来举几个快速获取T-SQL脚本的例子. ================================================

SQL Server 2012笔记分享-38:了解系统数据库

master 数据库 记录 SQL Server 实例的所有系统级信息. master 数据库记录 SQL Server 系统的所有系统级信息.这包括实例范围的元数据(例如登录帐户).端点.链接服务器和系统配置设置.此外,master 数据库还记录了所有其他数据库的存在.数据库文件的位置以及 SQL Server 的初始化信息.因此,如果 master 数据库不可用,则 SQL Server 无法启动.在 SQL Server 中,系统对象不再存储在 master 数据库中,而是存储在 Reso

SQL Server 2012笔记分享-8:理解包含数据库

包含数据库的四大核心特点 独立于其他数据库以及独立于承载数据库的 SQL Server 实例的一种数据库. 很多用于描述数据库的元数据都在该数据库中维护. 使用相同的排序规则定义所有元数据. 数据库可执行用户身份验证,因此减少了对 SQL Server 实例的登录名的数据库依赖关系. 包含数据库解决的问题 在你将SQL Server 2012包含数据库隔离之后,你就可以轻易将其从一个SQL Server实例迁移至另一个SQL Server实例,而不必迁移一组SQL Server登录.此包含数据库

jQuery整理笔记九----功能性表格开发

示例中用到的一些图片.插件.样式文件等下载地址:点我进入下载 过去在开发过程中关于table方面的jquery应用仅仅是局限于使用jquery操作table增加一行.删除一列等等操作.今天整理的跟过去用的不一样. 1.uiTableFilter uiTableFilter是一款表格数据行过滤插件,使用很简单,具体用法如下: $.uiTableFilter(table,phrase)  该函数包含两个参数,其中第一个参数为jQuery对象,即为jQuery方法匹配的表格,或者也可以是jQuery匹