下文将为您介绍SQL server数据库危险存储过程删除,并附上恢复脚本,供您参考,如果您在危险存储过程删除及恢复遇到了问题,不妨一看,相信对您会有所启迪。
删除所有危险的 扩展 .
exec sp_dropextendedProc ’xp_cmdshell’ [删除此项扩展后,将无法远程连接数据库]
以下3个存储过程会在SQL SERVER恢复备份时被使用,非必要请勿删除
#exec sp_dropextendedproc ’xp_dirtree’ [删除此项扩展后,将无法新建或附加数据库]#exec sp_dropextendedproc ’Xp_regread’ [删除此项扩展后, 还原数据库辅助]#exec sp_dropextendedproc ’xp_fixeddrives’ [删除此项扩展后,将无法还原数据库]
use masterEXEC sp_addextendedproc xp_cmdshell ,@dllname =’xpLog70.dll’EXEC sp_addextendedproc xp_enumgroups ,@dllname =’xplog70.dll’EXEC sp_addextendedproc xp_loginconfig ,@dllname =’xplog70.dll’EXEC sp_addextendedproc xp_enumerrorlogs ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_getfiledetails ,@dllname =’xpstar.dll’EXEC sp_addextendedproc Sp_OACreate ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OADestroy ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OAGetErrorInfo ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OAGetProperty ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OAMethod ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OASetProperty ,@dllname =’odsole70.dll’EXEC sp_addextendedproc Sp_OASTOP ,@dllname =’odsole70.dll’EXEC sp_addextendedproc xp_regaddmultistring ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regdeletekey ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regdeletevalue ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regenumvalues ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regremovemultistring ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regwrite ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_dirtree ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_regread ,@dllname =’xpstar.dll’EXEC sp_addextendedproc xp_fixeddrives ,@dllname =’xpstar.dll’go
sql存储过程的执行
执行带参数的存储过程的方法如下:Exec sp_configure allow updates,1--允许更新系统表。 exec _ChangeObjectOwnerBatch OldOwner,dbo以上是两个例子。 SQL Server中执行带参数的存储过程的方法是:EXEC 存储过程名字 参数1,参数2,数值参数EXEC 是一个关键字。 字符串参数使用单引号括起来,数值参数不需要使用单引号
怎么解决数据库中的冗余代码
一种PL/SQl解决方案:使用存储过程删除冗余数据,叫做DeleDuplicate的存储过程,这个过程的结构很清晰的.SQLListing 6. The DeleteDuplicate stored procedure它将这些冗余行选择一到一个游标中,然后从表中取出每一个冗余行来进行与游标中的行进行比对,然后决定是否删除CREATE OR REPLACE PROCEDURE DeleteDuplicates(pCommitBatchSize IN INTEGER := 5000) ISCURSOR csr_Duplicates ISSELECT ID, LastName, FirstNameFROM CustomersWHERE (LastName, FirstName) IN(SELECT LastName, FirstNameFROM CustomersGROUP BY LastName, FirstNameHAVING COUNT(*) > 1)ORDER BY LastName, FirstName;/*保存上一次的姓和名*/vLastName %TYPE := NULL;vFirstName %TYPE := NULL;vCounter INTEGER := 0;BEGIN FOR vDuplicates IN csr_DuplicatesLOOP IF vLastName IS NULL OR ( != vLastNameOR NVL(, ) != NVL(vFirstName, ))THEN/*第一次取出行或者是一个新行 保存它的姓和名的值*/ vLastName := ; vFirstName := ; ELSE/*冗余数据,删除它*/ DELETE FROM CustomersWHERE ID = ;vCounter := vCounter + 1;/*提交结果*/ /* Commit every pCommitBatchSize rows */ IF MOD(vCounter, pCommitBatchSize) = 0 THENCOMMIT; END IF;END IF;END LOOP; IF vCounter > 0THEN COMMIT;END IF;DBMS__LINE(TO_CHAR(vCounter) || duplicates have been deleted.); EXCEPTION WHEN OTHERSTHEN DBMS__LINE(Error || TO_CHAR(SQLCODE) || : || SQLERRM);ROLLBACK;END DeleteDuplicates;BEGINDeleteDuplicates;END;/SELECT LastName, FirstName, COUNT(*)FROM CustomersGROUP BY LastName, FirstNameHAVING COUNT(*) > 1;最后一个查询语句没有返回值,所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的,PL/SQl只是用来实现删除冗余数,那么能不能完全用SQL语句来实现呢?
SQL数据库表怎么删除3个月前的记录
其实SQL Server有个很好的功能,大家都忽略了,就是他强大的事务处理功能。 楼主可以写一个删除3个月前数据的存储过程,然后开启SQL Server代理,里面有个作业的,可以添加一个定期执行的作业,只要每天定期在空闲的时候执行就可以了。 当然了,触发器也是可以实现,但是触发器有个弊端,就是必须有数据插入、修改或者删除才能执行。
发表评论