怎样删除所有用户存储过程?
顺便求删除view、function、index等的方法。
[解决办法]
复制一个列子:
USE pubs
--创建角色 r_test
EXEC sp_addrole 'r_test '
--授予 r_test 对 jobs 表的所有权限
GRANT ALL ON jobs TO r_test
--授予角色 r_test 对 titles 表的 SELECT 权限
GRANT SELECT ON titles TO r_test
--添加登录 l_test,设置密码为pwd,默认数据库为pubs
EXEC sp_addlogin 'l_test ', 'pwd ', 'pubs '
--为登录 l_test 在数据库 pubs 中添加安全账户 u_test
EXEC sp_grantdbaccess 'l_test ', 'u_test '
--添加 u_test 为角色 r_test 的成员
EXEC sp_addrolemember 'r_test ', 'u_test '
--拒绝安全账户 u_test 对 titles 表的 SELECT 权限
DENY SELECT ON titles TO u_test
/*--完成上述步骤后,用 l_test 登录,可以对jobs表进行所有操作,但无法对titles表查询,虽然角色 r_test 有titles表的select权限,但已经在安全账户中明确拒绝了对titles的select权限,所以l_test无titles表的select权限--*/
--从数据库 pubs 中删除安全账户
EXEC sp_revokedbaccess 'u_test '
--删除登录 l_test
EXEC sp_droplogin 'l_test '
--删除角色 r_test
EXEC sp_droprole 'r_test '
[解决办法]
1、不用SQL語句的:直接在界面上完成
2、用SQL語句的:
可以用一個循環從sysobjects中查出相應的存儲過程、視圖等的名字後再drop掉即可
[解决办法]
declare @str varchar(8000)
select @str = ' '
select @str=@str+ 'drop porc '+name+ ' ' from sysobjects where xtype = 'P '
print @str -- 显示
exec(@str) --删除
[解决办法]
create proc usp_deny (@userid varchar(20))
as
declare @sql varchar(1000)
declare @name varchar(100)
declare @type varchar(10)
if @userid is null
return
declare cur_objects cursor for
select name,type from sysobjects where xtype in ( 'P ', 'V ', 'FN ', 'TF ')
open cur_objects
fetch next from cur_objects into @name,@type
while @@fetch_status=0
begin
if @type = 'V '--视图
begin
select @sql = 'DROP VIEW '+@name
exec(@sql)
end
if @type = 'P '--存储过程
begin
select @sql = 'DROP PROC '+@name
exec(@sql)
end
if @type in( 'FN ', 'TF ')--函数
begin
select @sql = 'DROP FUNCTION '+@name
exec(@sql)
end
fetch next from cur_objects into @name,@type
end
close cur_objects
deallocate cur_objects
[解决办法]
顶
=========================
declare @str varchar(8000)
select @str = ' '
select @str=@str+ 'drop porc '+name+ ' ' from sysobjects where xtype = 'P '
print @str -- 显示
exec(@str) --删除
[解决办法]
declare @str_proc varchar(8000)
declare @str_view varchar(8000)
declare @str_function varchar(8000)
select @str_proc = ' '
select @str_view = ' '
select @str_function = ' '
select @str_proc=@str_proc+ 'drop porc '+name+ ' ' from sysobjects where xtype = 'P '
select @str_view=@str_view+ 'drop view '+name+ ' ' from sysobjects where xtype = 'V '
select @str_function=@str_function+ 'drop function '+name+ ' ' from sysobjects where xtype = 'FN '
print @str_proc -- 显示
print @str_view -- 显示
print @str_function -- 显示
exec(@str_proc) --删除
exec(@str_view) --删除
exec(@str_function) --删除
[解决办法]
用动态的sql能好一点,个人感觉。
[解决办法]
如果proc,func,view数量足够多的时候,动态SQL会报错.
[解决办法]
--要加上一個GO
declare @str varchar(8000)
select @str = ' '
select @str=@str+ 'drop porc '+name+char(13)+ 'Go '+char(13) from sysobjects where xtype = 'P '
print @str -- 显示
[解决办法]
直接将数据库数据导出到新数据库,就只有表,没有存储过程、视图等了,再把旧数据库删了,新的改名为原名,ok了
[解决办法]
注意:上面的不能直接使用,会把系统存储过程也删除,你最好在帮助中先查询出来,按某一字段区别开来,我想若把系统存储过程也删了就没意义了吧。
我看了crdate(创建日期)还有其它字段都可用于标识