Oracle 与Sql Server AND 存贮过程与触发器

实验内容
1,oracle中,使用存储过程的方式,实现登录日志。
2, SQLserver中,使用存储过程的方式,实现登录日志。
3,oracle中,在用户表中添加最后登录时间字段,使用触发器的方式,实现登录日志。
4, SQLserver中,在用户表中添加最后登录时间字段,使用触发器的方式,实现登录日志。

1 1. Oracle_建表.sql
2 2. --建立用户表
3 3. CREATE TABLE "SCOTT"."ACCOUNT" ("NAME" VARCHAR2(10) NOT NULL, "PASSWORD"
4 4. NUMBER(10) NOT NULL, "LASTLANDED" DATE NOT NULL, PRIMARY
5 5. KEY("NAME"))
6 6. TABLESPACE "USERS"
7 7.
8 8. --建立日志表
9 9. CREATE TABLE "SCOTT"."LOG" ("LOGINLOG" VARCHAR2(10) NOT NULL, "NAME"
10 10. VARCHAR2(10) NOT NULL, PRIMARY KEY("NAME"), FOREIGN KEY("NAME")
11 11. REFERENCES "SCOTT"."ACCOUNT"("NAME"))
12 12. TABLESPACE "USERS"
13 13.
14 14. Oracle_ 存储过程_登录日志.sql
15 15. --Oracle中,使用存储过程的方式,实现登录日志
16 16. CREATE OR REPLACE PROCEDURE "SCOTT"."LOGIN"(name_param in VARCHAR2, password_param in NUMBER)
17 17. is
18 18. var_name VARCHAR2(10);
19 19. var_password NUMBER(10);
20 20. var_message VARCHAR2(10);
21 21. begin
22 22. select password INTO var_password from "SCOTT"."ACCOUNT" where name = name_param;
23 23. if var_password = password_param then
24 24. var_message := '登陆成功';
25 25. insert into "SCOTT"."LOG"(LoginLog, name) values (var_message, name_param);
26 26. else
27 27. var_message := '登陆失败';
28 28. insert into "SCOTT"."LOG"(LoginLog, name) values (var_message, name_param);
29 29. end if;
30 30. commit;
31 31. end;
32 32.
33 33. Oracle_ 触发器_登录日志.sql
34 34. Create or replace Trigger login2
35 35. after insert or update
36 36. On "SCOTT"."LOG"
37 37. declare
38 38. var_LoginLog VARCHAR2(10);
39 39. var_name VARCHAR2(10);
40 40. begin
41 41. select loginlog into var_LoginLog from "SCOTT"."LOG";
42 42. if var_LoginLog = '登陆成功' then
43 43. Update "SCOTT"."ACCOUNT" Set lastLanded = sysdate where name = var_name;
44 44. end if;
45 45. end;
46 46.
47 47.
48 48.
49 49. SQLserver_ 建表.sql
50 50. USE [tempdb]
51 51. GO
52 52. /****** 对象: Table [dbo].[account] 脚本日期: 06/24/2010 20:52:48 ******/
53 53. SET ANSI_NULLS ON
54 54. GO
55 55. SET QUOTED_IDENTIFIER ON
56 56. GO
57 57.
58 58. --建立用户表
59 59. CREATE TABLE [dbo].[account](
60 60. [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
61 61. [password] [int] NULL,
62 62. [lastLanded] [datetime] NULL,
63 63. CONSTRAINT [PK_account] PRIMARY KEY CLUSTERED
64 64. (
65 65. [name] ASC
66 66. )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
67 67. ) ON [PRIMARY]
68 68.
69 69. --建立日志表
70 70. CREATE TABLE [dbo].[log](
71 71. [LoginLog] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
72 72. [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
73 73. CONSTRAINT [PK_log] PRIMARY KEY CLUSTERED
74 74. (
75 75. [name] ASC
76 76. )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
77 77. ) ON [PRIMARY]
78 78.
79 79. GO
80 80. ALTER TABLE [dbo].[log] WITH CHECK ADD CONSTRAINT [FK_log_account] FOREIGN KEY([name])
81 81. REFERENCES [dbo].[account] ([name])
82 82. GO
83 83. ALTER TABLE [dbo].[log] CHECK CONSTRAINT [FK_log_account]
84 84.
85 85. SQLserver_ 存储过程_登录日志.sql
86 86. --SQLserver中,使用存储过程的方式,实现登录日志。
87 87. CREATE PROCEDURE login
88 88. @name_param nchar(10), @password_param int
89 89. AS
90 90. Declare
91 91. @var_name nchar(10), @var_password int, @var_message nchar(10);
92 92. BEGIN
93 93. SET NOCOUNT ON;
94 94. -- Insert statements for procedure here
95 95. select @var_password = password from [dbo].[account] where name = @name_param;
96 96. if @var_password = @password_param
97 97. set @var_message = '登陆成功';
98 98. insert into [dbo].[log](LoginLog, name) values (@var_message, @var_name);
99 99. if @var_password <> @password_param
100 100. set @var_message = '登陆失败';
101 101. insert into [dbo].[log](LoginLog, name) values (@var_message, @var_name);
102 102. commit;
103 103. END
104 104. GO
105 105. --Drop Procedure login
106 106. --Go
107 107.
108 108. SQLserver_ 触发器_登录日志.sql
109 109. Create Trigger login2 On [dbo].[log] --在log表中创建触发器
110 110. FOR insert ,replace --为什么事件触发
111 111. As
112 112. declare @var_LoginLog nvarchar(50)
113 113. declare @var_name nchar(10)
114 114. select @var_LoginLog =[dbo].[log].LoginLog from [dbo].[log]
115 115. select @var_name =[dbo].[log].name from [dbo].[log]
116 116. begin --事件触发后所要做的事情
117 117. if(@var_LoginLog = '登陆成功')
118 118. Update [dbo].[account] Set lastLanded = GETDATE() where name = @var_name
119 119. end
120 120. 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等操作的发生作为触发事件才被调用

posted on 2010-07-08 21:47  Bin@Blogs  阅读(308)  评论(0)    收藏  举报

导航