存储过程-触发器-函数
- 格式:ppt
- 大小:263.50 KB
- 文档页数:39
SQLServer中查看加密的存储过程、函数,视图,触发器今天在从SQL Server 2000 中导出数据库结构和数据的时候,出现了⼀个错误:do.[proc_GetNewPoNo] 是加密存储过程。
SQL Server 2000 中不⽀持加密存储过程。
顾名思义该存储过程已经加密了,需要解密,在⽹上搜索了⼀下,运⾏,直接通过。
代码如下:SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGOCREATE PROCEDURE proc_decrypt(@objectname varchar(50))ASbeginset nocount on--破解字节不受限制,适⽤于SQL SERVER 2000 存储过程,函数,视图,触发器--修正上⼀版"视图触发器"不能正确解密错误--begin trandeclare @objectname1 varchar(100),@orgvarbin varbinary(8000)declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)declare @i int,@status int,@type varchar(10),@parentid intdeclare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number intselect @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@objectname)create table #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int)insert #temp Select number,colid,ctext,encrypted,status FROM syscomments Where id = object_id(@objectname)select @number=max(number) from #tempset @k=0while @k<=@numberbeginif exists(select 1 from syscomments where id=object_id(@objectname) and number=@k)beginif @type='P'set @sql1=(case when @number>1 then 'Alter PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS 'else 'Alter PROCEDURE '+ @objectname+' WITH ENCRYPTION AS 'end)if @type='TR'begindeclare @parent_obj varchar(255),@tr_parent_xtype varchar(10)select @parent_obj=parent_obj from sysobjects where id=object_id(@objectname)select @tr_parent_xtype=xtype from sysobjects where id=@parent_objif @tr_parent_xtype='V'beginset @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF Insert AS PRINT 1 'endelsebeginset @sql1='Alter TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 'endendif @type='FN' or @type='TF' or @type='IF'set @sql1=(case @type when 'TF' then'Alter FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end 'when 'FN' then'Alter FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'when 'IF' then'Alter FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'end)if @type='V'set @sql1='Alter VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'set @q=len(@sql1)set @sql1=@sql1+REPLICATE('-',4000-@q)select @sql2=REPLICATE('-',8000)set @sql3='exec(@sql1'select @colid=max(colid) from #temp where number=@kset @n=1while @n<=CEILING(1.0*(@colid-1)/2) and len(@sql3)<=3996beginset @sql3=@sql3+'+@'set @n=@n+1endset @sql3=@sql3+')'exec sp_executesql @sql3,N'@sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2endset @k=@k+1endset @k=0while @k<=@numberbeginif exists(select 1 from syscomments where id=object_id(@objectname) and number=@k)beginselect @colid=max(colid) from #temp where number=@kset @n=1while @n<=@colidbeginselect @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp Where colid=@n and number=@kSET @OrigSpText3=(Select ctext FROM syscomments Where id=object_id(@objectname) and colid=@n and number=@k)if @n=1beginif @type='P'SET @OrigSpText2=(case when @number>1 then 'Create PROCEDURE '+ @objectname +';'+rtrim(@k)+' WITH ENCRYPTION AS 'else 'Create PROCEDURE '+ @objectname +' WITH ENCRYPTION AS 'end)if @type='FN' or @type='TF' or @type='IF'SET @OrigSpText2=(case @type when 'TF' then'Create FUNCTION '+ @objectname+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end 'when 'FN' then'Create FUNCTION '+ @objectname+'(@a char(1)) returns char(1) with encryption as begin return @a end'when 'IF' then'Create FUNCTION '+ @objectname+'(@a char(1)) returns table with encryption as return select @a as a'end)if @type='TR'beginif @tr_parent_xtype='V'beginset @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF Insert AS PRINT 1 ' endelsebeginset @OrigSpText2='Create TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR Insert AS PRINT 1 'endendif @type='V'set @OrigSpText2='Create VIEW '+@objectname+' WITH ENCRYPTION AS Select 1 as f'set @q=4000-len(@OrigSpText2)set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)endelsebeginSET @OrigSpText2=REPLICATE('-', 4000)endSET @i=1SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))WHILE @i<=datalength(@OrigSpText1)/2BEGINSET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^(UNICODE(substring(@OrigSpText2, @i, 1)) ^UNICODE(substring(@OrigSpText3, @i, 1)))))SET @i=@i+1ENDset @orgvarbin=cast(@OrigSpText1 as varbinary(8000))set @resultsp=(case when @encrypted=1then @resultspelse convert(nvarchar(4000),case when @status&2=2 then uncompress(@orgvarbin) else @orgvarbin end)end)print @resultspset @n=@n+1endendset @k=@k+1enddrop table #temprollback tranendGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO创建成功后,需要:EXEC proc_decrypt XXX -- 你的存储过程名称、函数名称、视图名称、触发器名称谢谢浏览!。
触发器、存储过程和函数三者有何区别四什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;你所说的函数是自定义函数吧,函数是根据输入产生输出,自定义只不过输入输出的关系由用户来定义。
在什么时候用触发器?要求系统根据某些操作自动完成相关任务,比如,根据买掉的产品的输入数量自动扣除该产品的库存量。
什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
存储过程和用户自定义函数具体的区别先看定义:存储过程存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。
存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。
它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点:·可以在单个存储过程中执行一系列SQL 语句。
·可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
·存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。
用户定义函数函数是由一个或多个Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。
Microsoft? SQL Server? 2000 并不将用户限制在定义为Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用CREATE FUNCTION 语句创建、使用ALTER FUNCTION 语句修改、以及使用DROP FUNCTION 语句除去用户定义函数。
每个完全合法的用户定义函数名(database_name.owner_name.function_name) 必须唯一。
Oracle中触发器如何调⽤存储过程1--创建测试表B_TEST_TABLE,稍后会在本表上增加触发器,在插⼊本表的同时复制⼀份数据到B_TEST_TABLE2中2create table B_TEST_TABLE3(4 c1 VARCHAR2(200),5 d2 DATE6);78--创建B_TEST_TABLE2表,在插⼊B_TEST_TABLE数据时,复制⼀份数据到本表中9create table B_TEST_TABLE210(11 c1 VARCHAR2(200),12 d2 DATE13);1415--创建存储过程,往B_TEST_TABLE2中插⼊⼀条数据16create or replace procedure TestPro(C1 VARCHAR2) is17begin18INSERT INTO B_TEST_TABLE2 VALUES (C1, SYSDATE);19--因为此存储过程是触发器中调⽤的,所以不能增加提交命令20--COMMIT;21end TestPro;22--下⾯这个斜杠不能去掉,否则会导致触发器和存储过程或其他脚本编译在同⼀个对象中,每个单独的对象都应⽤此符号分开(建表等操作除外) 23/24--创建触发器,before insert on b_test_table为在插⼊b_test_table数据之前触发,可以改成after insert on b_test_table25--或者before update on b_test_table等选项26create or replace trigger TEST_TABLE_TRIGGER_INST_BF27 before insert on b_test_table28for each row29begin30--调⽤存储过程:new代表的是新的记录对象,可以直接取值或修改该记录的每⼀列,:new.c1是取新纪录的c1列值,:new.d2是取新纪录的d2列值31 TestPro(:new.c1);32--如果不想⽤存储过程也可以直接这样写33--INSERT INTO B_TEST_TABLE2 VALUES (:new.c1, :new.d2);34end TEST_TABLE_TRIGGER_INST_BF;35/36--插⼊测试数据37insert into B_TEST_TABLE values ('1', sysdate);38commit;3940--查询测试表数据41select*from B_TEST_TABLE;42select*from B_TEST_TABLE2;。
存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。
一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。
它类似于程序中的函数,可以接受参数、返回值、流程控制等。
2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。
二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。
```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。
```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。
```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。
```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。
实验六存储过程和触发器142208100149 陈聪1、目的与要求(1)掌握存储过程的使用方法。
(2)掌握触发器的使用方法。
2、实验准备(1)了解存储过程的使用方法。
(2)了解触发器的使用过程。
(3)了解inserted逻辑表和deleted逻辑表的使用。
(4)了解如何编写CRL存储过程与触发器。
3、实验内容。
(1)存储过程。
①创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。
注:此段T-SQL命令,书上变量名书写错误,漏掉了下划线。
(@nu_MBER1和@nu MBER1区别)执行该存储过程,并查看结果。
②创建存储过程,比较两个员工的实际收入,若前者比后者高就输出0,否则输出1.执行该存储过程并查改结果。
③创建添加职员记录的存储过程EmployeeAdd。
执行该存储过程。
执行上面T-SQL命令,在结果栏中显示一行受影响,说明结果已经插入成功,在表Employees中也够看到结果已经存在。
④创建存储过程,使用游标确定一个员工的实际收入是否排在前3名。
结果为1表示是,结果为0表示否。
执行该存储过程,在结果栏中显示,命令已成功完成,并且在左侧对象资源管理器中进行刷新会显示刚刚创建的存储过程。
执行该存储过程:上面T-SQL结果中输出“1”,代表着员工“108991”的实际收入排在前三名。
【思考与练习】A、创建存储过程,要求当一个员工的工作年份大于6年时,将其转到经理办公室工作。
创建这个存储过程时候,在存储过程的条件判断中我添加了一项,判断工作年份在6年以上的员工是否在经理办公室,只有不在经理办公室的时候才进行调整,这样更符合实际问题些。
然后执行上面的存储过程,并且查看结果:此时有可能会出现(我就出现了)这样的问题,在之前实验三中就出现了。
解决方法同样是解除规则的绑定。
查看表Employees中员工“000001”的DepartmentID已经修改为“3”(经理办公室)。
数据库的⼀些基本概念(视图,存储过程,函数,触发器)⼀、视图视图定义视图是从⼀个或⼏个基本表(或视图)中导出的虚拟的可视化的表。
在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图特点安全:有的数据是需要保密的,如果直接把表给出来进⾏操作会造成泄密,那么可以通过创建视图把相应视图的权限给出来即可保证数据的安全。
⾼效:复杂的连接查询,每次执⾏时效率⽐较低,可以考虑新建视图,每次从视图中获取,将会提⾼效率。
定制数据:将常⽤的字段放置在视图中。
使⽤视图不会加快数据查询速度。
⼆、存储过程存储过程(Stored Procedure)是在⼤型数据库系统中,⼀组为了完成特定功能的SQL 语句集,存储在数据库中,经过第⼀次编译后调⽤不需要再次编译,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。
存储过程是数据库中的⼀个重要对象。
优点存储过程的能⼒⼤⼤增强了SQL语⾔的功能和灵活性。
可保证数据的安全性和完整性。
通过存储过程可以使没有权限的⽤户在控制之下间接地存取数据库,从⽽保证数据的安全。
存储过程可以使相关的动作在⼀起发⽣,从⽽可以维护数据库的完整性。
在运⾏存储过程前,数据库已对其进⾏了语法和句法分析,并给出了优化执⾏⽅案。
这种已经编译好的过程可极⼤地改善SQL语句的性能。
可以降低⽹络的通信量。
使体现企业规则的运算程序放⼊数据库服务器中,以便集中控制。
三、函数在数据库中都有函数,这些函数属于系统函。
除此之外⽤户也可以编写⽤户⾃定义函数。
⽤户定义函数是存储在数据库中的代码块,可以把值返回到调⽤程序。
调⽤时如同系统函数⼀样,如max(value)函数,其value被称为参数。
函数⼀般功能⽐较简单,对于mysql函数只有传⼊参数,不像存储过程⼀样,有输⼊输出参数。
数据库函数特点如下:存储函数将向调⽤者返回⼀个且仅返回⼀个结果值。
存储函数嵌⼊在sql中使⽤的,可以在select中调⽤,就像内建函数⼀样,⽐如cos()、hex()。
实验四过程、函数、触发器和程序包实验目的:(1)了解存储过程的作用;(2)了解函数的作用;(3)掌握存储过程的创建;(4)掌握存储过程的调用;(5)掌握函数的建立;(6)掌握函数的调用。
(7) 掌握触发器的基本作用及使用方法。
(8) 掌握触发器的建立、修改、查看、删除操作。
实验内容:一、过程、歪数(1)无参数的存储过程创建一个存储过程proc_execution,要求能够将empno为‘9010’的员工姓名更改为'yourname',并调用执行这个存储过程。
(2)带输入参数的存储过程创建一个存储过程,参数为员工编号,该存储过程能够删除指定的员工信息。
请编写并调用该存储过程。
(3)带输入输出的存储过程创建一个存储过程,要求能够查询并返回EMP中给定职工号的姓名、工资和佣金。
请编写并调用该存储过程。
(4)带输入参数的函数:创建一个函数get_sal,要求能够查询并返回EMP中给定职工号的工资,请编写该函数并正确调用。
(5)用异常处理完善程序请将第任务1中的程序完善,如果输入的员工号不存在,则执行异常处理,显示“此员工不存在”。
(6)创建函数,实现功能为:在scott.emp表和scott.dept 表中查询出任意给定职工号的职工姓名及职工所在部门的名称。
(7)对存储过程、函数及触发器实现查看、修改、删除等基本操作。
二、触发器1. 以SCOTT帐号登录,完成以下操作:(1)利用以下SQL语句,创建emp_copy表和emp_bak表(2)在emp表中创建一个触发器tg_insert_emp,当向emp表中添加一条记录时,自动向emp_copy表也自动添加一条记录。
当向emp表中更新一条记录时,自动更新emp_copy表中相关记录。
(3)当删除emp表中一条记录时,自动删除emp_copy表中相关记录,并且将删除的记录自动添加到emp_bak表。
2.请编写相关触发器,完成下列操作:利用下面的命令创建一个表OP_LOGCREATE OR REPLACE TABLE op_log(ID V ARCHAR2(20) PRIMARY KEY, op_dae date,op_type varchar2(200),op_user varhcar2(50));(1)编写一个触发器,当系统关闭时,记录系统关闭的时间及操作用户。
oracle begin 用法Oracle Begin 用法在Oracle数据库中,BEGIN是一个关键字,表示一个代码块的开始,可以用来定义和执行存储过程、触发器、函数和匿名块等。
下面是一些BEGIN的常见用法,并提供详细的讲解:1. 存储过程使用BEGIN关键字可以定义存储过程,存储过程是一组预定义的SQL语句集合,可以在需要时调用执行。
CREATE OR REPLACE PROCEDURE my_procedure ASBEGIN-- 在此处编写存储过程的代码逻辑END;/其中,CREATE OR REPLACE PROCEDURE语句用于创建或更新存储过程,my_procedure是存储过程的名称。
2. 触发器触发器是一种数据库对象,可以在特定条件下自动执行一系列的SQL语句。
使用BEGIN可以定义触发器的执行过程。
CREATE OR REPLACE TRIGGER my_trigger AFTER INSERT ON my_table FOR EACH ROWBEGIN-- 在此处编写触发器的代码逻辑END;/在上述示例中,AFTER INSERT表示触发器在插入操作之后执行,my_table是触发器所针对的表。
3. 函数函数是一种可重用的程序模块,用于执行特定的操作并返回一个值。
BEGIN关键字可以用于定义函数的内部逻辑。
CREATE OR REPLACE FUNCTION my_function (p_input VAR CHAR2) RETURN INTEGER ASBEGIN-- 在此处编写函数的代码逻辑RETURN 0;END;/上述示例中,CREATE OR REPLACE FUNCTION语句用于创建或更新函数,my_function是函数的名称,(p_input VARCHAR2)表示函数的输入参数。
4. 匿名块匿名块是一段不带名称的PL/SQL代码,可以直接执行。
BEGIN关键字可以用来包裹匿名块的代码逻辑。