ms sql server 关于存储过程的问题

了解 2014-01-10 01:32:53
应用程序每次启动时都会执行下面这句代码

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名]

create proc 存储过程名 参数
as
语句

--------------------------------------------------------------------------------------------
俺明白程序的意思,判断,如果存在就删除重建
--------------------------------------------------------------------------------------------
俺想达到的结果是:在程序create后,执行alter,就是程序刚建立后,我就更改存储过程的内容。
但是没有作用于存储过程的触发器呀,这个功能怎么实现? 求大神,测试通过立即给分。
...全文
126 点赞 收藏 18
写回复
18 条回复
了解 2014年01月11日
16楼书写有误,重新写 tcmakebest ,你好,你还是没有明白我的意思呀。 删除重建,与楼主想要的 alter 结果是一样的,但是很明显删除重建更简单啊. 按照楼主的意思,不存在时建立,存在时修改,这不是要写两套方法,找自己麻烦么. (我删除重建了,程序启动时会判断的,无论存在不存在,就删除,按照程序写死的存储代码建立它。) (我的意思是有没有类似触发器功能的东东,发现它被建立了修改,不是存在时修改,再说了存在时修改不是自找麻烦吗。你可以简单理解为需要绕过程序的执行,屏蔽一些原程序运行时的判断,可以按照这个思路去找找方法) 比如:原程序如下 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名] create proc 存储过程名 参数 as select 'abc' 其它... 程序是要按照这个路子走的,我想要的是下面的内容。 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名] create proc 存储过程名 参数 as select 'abc' alter proc 存储过程名 参数 as select 'good' 其它... ----------------------------------------------------- 看清楚了吧,alter相当于一个触发器了,它是自动执行的。 不知道这样大神们是否明白,假如程序我们无法更改,只有这样操作,才能更改程序的执行过程和输出结果。 直接在数据库中删除,然后我们更改,这大家都会做的,但是那样是没有任何作用的。必须找到类似触发器功能的东东,这样就可以了。只要存储被删除建立,就自动触发更改。无论程序怎么往下走,都是按照我们的思路,或者说是按照我传给它的信息在继续。也就达到了调试的目的。(只要找到类似的功能,测试通过立即给分)
回复 点赞
了解 2014年01月11日
tcmakebest ,你好,你还是没有明白我的意思呀。 删除重建,与楼主想要的 alter 结果是一样的,但是很明显删除重建更简单啊. (我删除重建了,程序启动时会判断的,无论存在不存在,就删除,按照程序写死的存储代码建立它。) 按照楼主的意思,不存在时建立,存在时修改,这不是要写两套方法,找自己麻烦么. (我的意思是有没有类似触发器功能的东东,发现它被建立了修改,不是存在时修改,再说了存在时修改是自找麻烦吗。你可以简单理解为需要绕过程序的执行,屏蔽一些原程序运行时的判断,可以按照这个思路去找找方法) 比如: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名] create proc 存储过程名 参数 as update tb set a=b 其它... 程序是要按照这个路子走的,我想要的是下面的内容。 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存储过程名] create proc 存储过程名 参数 as select 'abc' alter proc 存储过程名 参数 as select 'good' 其它... ----------------------------------------------------- 不知道这样大神们是否明白,假如程序我们无法更改,只有这样操作,才能更改程序的执行过程和输出结果。 直接在数据库中删除,然后我们更改,这大家都会做的,但是那样是没有任何作用的。必须找到类似触发器功能的东东,这样就可以了。只要存储被删除建立,就自动触发更改。无论程序怎么往下走,都是按照我们的思路,或者说是按照我传给它的信息在继续。也就达到了调试的目的。(只要找到类似的功能,测试通过立即给分)
回复 点赞
tcmakebest 2014年01月11日
删除重建,与楼主想要的 alter 结果是一样的,但是很明显删除重建更简单啊. 按照楼主的意思,不存在时建立,存在时修改,这不是要写两套方法,找自己麻烦么.
回复 点赞
了解 2014年01月10日
可能有,但是非常麻烦,不是一个简单的触发器可以实现,还不知道触发器能不能做,可以看看DDL触发器能不能做吧 大版主,小弟实在想不出办法了,望赐教。。。
回复 点赞
發糞塗牆 2014年01月10日
系统表不能加
回复 点赞
了解 2014年01月10日
没有置于存储过程上的触发器呀,姑而发问,有没有其它可以变向实现的方法? 小弟还有一问,有没有作用于sysobjects系统表上的触发器?(怎么实现对系统表的跟踪)
回复 点赞
發糞塗牆 2014年01月10日
可能有,但是非常麻烦,不是一个简单的触发器可以实现,还不知道触发器能不能做,可以看看DDL触发器能不能做吧
回复 点赞
了解 2014年01月10日
发现它被重建了,触发alter,sql有这样的功能吗?
回复 点赞
發糞塗牆 2014年01月10日
那就改不了了
回复 点赞
了解 2014年01月10日
DBA_Huangzj ,你好,程序是程序,我们已经无法改变它的代码,不可逆的。跟踪是跟踪,我们现在知道程序怎么走的了,那就见缝插针,在程序执行判断、存在、删除、重建这4个必须过程之后我们加个触发器什么的,更改存储过程的内容,还让程序继续执行,但是呢,同时也达到了我们想要的结果。 我知道可以在数据库中直接alter,但是,那样做是没有意义的,因为程序一旦启动,就会按照它的代码执行重建,那样就不是我们测试和调试所要的结果了。希望你理解一下。
回复 点赞
發糞塗牆 2014年01月10日
那就不用删了再创建,直接存在就alter嘛
回复 点赞
發糞塗牆 2014年01月10日
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) alter procedure [dbo].[存储过程名] 参数 as 语句
回复 点赞
了解 2014年01月10日
同时也请 DBA_Huangzj 版主想想其它办法,俺调试程序呢,很着急,先谢了。
回复 点赞
了解 2014年01月10日
请 OrchidCat 说的在详细点,直接贴个例子也可以。 ap0405140 ,你好,程序原代码找不到,不可逆,请用其它办法。
回复 点赞
發糞塗牆 2014年01月10日
不建议这样搞
回复 点赞
唐诗三百首 2014年01月10日
找到应用程序的源代码,直接修改create proc..的存储过程代码.
回复 点赞
Mr_Nice 2014年01月10日
DDL 触发器,验证存储过程名是否被创建,创建就执行修改。
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9306

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告