设为首页 收藏本站
查看: 579|回复: 0

[经验分享] Oracle 与Sql Server AND 存贮过程与触发器

[复制链接]
YunVN网友  发表于 2016-8-13 07:08:05 |阅读模式
实验内容
1,oracle中,使用存储过程的方式,实现登录日志。
2, SQLserver中,使用存储过程的方式,实现登录日志。
3,oracle中,在用户表中添加最后登录时间字段,使用触发器的方式,实现登录日志。
4, SQLserver中,在用户表中添加最后登录时间字段,使用触发器的方式,实现登录日志。

Oracle_建表.sql
--建立用户表
CREATE TABLE "SCOTT"."ACCOUNT" ("NAME" VARCHAR2(10) NOT NULL, "PASSWORD"
NUMBER(10) NOT NULL, "LASTLANDED" DATE NOT NULL, PRIMARY
KEY("NAME"))  
TABLESPACE "USERS"
--建立日志表
CREATE TABLE "SCOTT"."LOG" ("LOGINLOG" VARCHAR2(10) NOT NULL, "NAME"
VARCHAR2(10) NOT NULL, PRIMARY KEY("NAME"), FOREIGN KEY("NAME")
REFERENCES "SCOTT"."ACCOUNT"("NAME"))  
TABLESPACE "USERS"
Oracle_存储过程_登录日志.sql
--Oracle中,使用存储过程的方式,实现登录日志
CREATE OR REPLACE PROCEDURE "SCOTT"."LOGIN"(name_param in VARCHAR2, password_param in NUMBER)
is
var_name VARCHAR2(10);
var_password NUMBER(10);
var_message VARCHAR2(10);
begin
select password INTO var_password from "SCOTT"."ACCOUNT" where name = name_param;
if var_password = password_param then
var_message := '登陆成功';
insert into "SCOTT"."LOG"(LoginLog, name) values (var_message, name_param);
else
var_message := '登陆失败';
insert into "SCOTT"."LOG"(LoginLog, name) values (var_message, name_param);
end if;
commit;
end;
Oracle_触发器_登录日志.sql
Create or replace Trigger login2
after insert or update                     
On "SCOTT"."LOG"
declare
var_LoginLog VARCHAR2(10);
var_name VARCHAR2(10);
begin
select loginlog into var_LoginLog from "SCOTT"."LOG";
if var_LoginLog = '登陆成功' then
Update "SCOTT"."ACCOUNT" Set lastLanded = sysdate where name = var_name;
end if;
end;

SQLserver_建表.sql
USE [tempdb]
GO
/****** 对象:  Table [dbo].[account]    脚本日期: 06/24/2010 20:52:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--建立用户表
CREATE TABLE [dbo].[account](
[name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[password] [int] NULL,
[lastLanded] [datetime] NULL,
CONSTRAINT [PK_account] PRIMARY KEY CLUSTERED
(
[name] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--建立日志表
CREATE TABLE [dbo].[log](
[LoginLog] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_log] PRIMARY KEY CLUSTERED
(
[name] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[log]  WITH CHECK ADD  CONSTRAINT [FK_log_account] FOREIGN KEY([name])
REFERENCES [dbo].[account] ([name])
GO
ALTER TABLE [dbo].[log] CHECK CONSTRAINT [FK_log_account]
SQLserver_存储过程_登录日志.sql
--SQLserver中,使用存储过程的方式,实现登录日志。
CREATE PROCEDURE login
@name_param nchar(10), @password_param int
AS
Declare
@var_name nchar(10), @var_password int, @var_message nchar(10);
BEGIN
SET NOCOUNT ON;
-- Insert statements for procedure here
select @var_password = password from [dbo].[account] where name = @name_param;
if @var_password = @password_param
set @var_message = '登陆成功';
insert into [dbo].[log](LoginLog, name) values (@var_message, @var_name);
if @var_password <> @password_param
set @var_message = '登陆失败';
insert into [dbo].[log](LoginLog, name) values (@var_message, @var_name);
commit;
END
GO
--Drop Procedure login
--Go
SQLserver_触发器_登录日志.sql
Create Trigger login2 On [dbo].[log]  --在log表中创建触发器
FOR insert ,replace                      --为什么事件触发
As  
declare @var_LoginLog nvarchar(50)
declare @var_name nchar(10)
select @var_LoginLog =[dbo].[log].LoginLog from [dbo].[log]
select @var_name =[dbo].[log].name from [dbo].[log]
begin                                     --事件触发后所要做的事情        
if(@var_LoginLog = '登陆成功')
Update [dbo].[account] Set lastLanded = GETDATE() where name = @var_name
end   
go

实验结论
1.SQL Server与Oracle在定义变量方式与变量类型上存在差别
2.给自定义的临时变量赋值语句也存在差别
select password INTO var_password from "SCOTT"."ACCOUNT" where name = name_param;(Oracleb版)
select @var_password = password from [dbo].[account] where name = @name_param;( SQL Server版)
3.if-else语句格式和创建触发器的格式都有微小差别
4.存储过程可以通过程序或其他过程的调用进行执行;触发器虽然也算一种存储过程,但一般要靠insert,update,delete等操作的发生作为触发事件才被调用

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257040-1-1.html 上篇帖子: 如何在Oracle中导出导入dmp文件?(转) 下篇帖子: ORACLE应用中常见的傻瓜问题1000问(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表