看代码如下:
T-SQL
--
-----------------------------------------
--在查询分析器里面执行proc中的语句
use pubs
go
create proc proc_P as select * from sysobjects
go
--在查询分析器里面执行proc中的语句
use pubs
go
create proc proc_P as select * from sysobjects
go
drop proc proc_P
--可以正常执行
--下面将这个在master库弄成存储过程,然后执行存储过程是否可以在pubs建立proc_P这个存储过程呢?
-- -------------master库中创建存储-----------------------------
-- 制表符 CHAR(9)
-- 换行符 CHAR(10)
-- 回车 CHAR(13)
create proc proc_M
as
declare @sql varchar ( 2000 )
set @sql = ' use pubs ' + CHAR ( 10 ) + CHAR ( 13 ) + ' go create proc proc_P as select * from sysobjects go '
exec ( @sql )
go
-- -------------执行存储过程-----------------------------
exec proc_M
-- ----------------错误信息-------------------------------
服务器: 消息 170 ,级别 15 ,状态 1 ,行 2
第 2 行: ' go ' 附近有语法错误。
服务器: 消息 111 ,级别 15 ,状态 1 ,行 3
' CREATE PROCEDURE ' 必须是批查询中的第一条语句。
--------------------------------------------------------
--可以正常执行
--下面将这个在master库弄成存储过程,然后执行存储过程是否可以在pubs建立proc_P这个存储过程呢?
-- -------------master库中创建存储-----------------------------
-- 制表符 CHAR(9)
-- 换行符 CHAR(10)
-- 回车 CHAR(13)
create proc proc_M
as
declare @sql varchar ( 2000 )
set @sql = ' use pubs ' + CHAR ( 10 ) + CHAR ( 13 ) + ' go create proc proc_P as select * from sysobjects go '
exec ( @sql )
go
-- -------------执行存储过程-----------------------------
exec proc_M
-- ----------------错误信息-------------------------------
服务器: 消息 170 ,级别 15 ,状态 1 ,行 2
第 2 行: ' go ' 附近有语法错误。
服务器: 消息 111 ,级别 15 ,状态 1 ,行 3
' CREATE PROCEDURE ' 必须是批查询中的第一条语句。
--------------------------------------------------------
'CREATE PROCEDURE' 必须是批查询中的第一条语句阻止了语句的执行。
结论:初越的体验到了存储过程必须是批查询中的第一条语句语法结构的重要性,如若不然就可以跨越数据库建立存储过程,表等,
这样一来的话。其他的库中的数据和信息就很容易被攻击和窃取。
(个人体验和总结,如有写的不好和错误的地方,忘大家原谅!)