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

