Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
8b27f983
提交
8b27f983
authored
14 年前
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
New sample application.
上级
96fea38b
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
118 行增加
和
0 行删除
+118
-0
RowAccessRights.java
h2/src/test/org/h2/samples/RowAccessRights.java
+112
-0
TestSampleApps.java
h2/src/test/org/h2/test/unit/TestSampleApps.java
+6
-0
没有找到文件。
h2/src/test/org/h2/samples/RowAccessRights.java
0 → 100644
浏览文件 @
8b27f983
/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
samples
;
import
java.sql.Connection
;
import
java.sql.DriverManager
;
import
java.sql.PreparedStatement
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
org.h2.tools.DeleteDbFiles
;
import
org.h2.tools.TriggerAdapter
;
/**
* This sample application show how to emulate per-row access rights so that
* each user can only access rows created by the given user.
*/
public
class
RowAccessRights
extends
TriggerAdapter
{
private
PreparedStatement
prepDelete
,
prepInsert
;
/**
* Called when ran from command line.
*
* @param args ignored
*/
public
static
void
main
(
String
...
args
)
throws
Exception
{
DeleteDbFiles
.
execute
(
"~"
,
"test"
,
true
);
Class
.
forName
(
"org.h2.Driver"
);
Connection
conn
=
DriverManager
.
getConnection
(
"jdbc:h2:~/test"
);
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"create table test_data(id int, user varchar, data varchar, primary key(id, user))"
);
stat
.
execute
(
"create index on test_data(id, user)"
);
stat
.
execute
(
"create view test as select id, data from test_data where user = user()"
);
stat
.
execute
(
"create trigger t_test instead of "
+
"insert, update, delete on test for each row "
+
"call \""
+
RowAccessRights
.
class
.
getName
()
+
"\""
);
stat
.
execute
(
"create user a password 'a'"
);
stat
.
execute
(
"create user b password 'b'"
);
stat
.
execute
(
"grant all on test to a"
);
stat
.
execute
(
"grant all on test to b"
);
ResultSet
rs
;
Connection
connA
=
DriverManager
.
getConnection
(
"jdbc:h2:~/test"
,
"a"
,
"a"
);
Statement
statA
=
connA
.
createStatement
();
statA
.
execute
(
"insert into test values(1, 'Hello'), (2, 'World')"
);
statA
.
execute
(
"update test set data = 'Hello!' where id = 1"
);
statA
.
execute
(
"delete from test where id = 2"
);
Connection
connB
=
DriverManager
.
getConnection
(
"jdbc:h2:~/test"
,
"b"
,
"b"
);
Statement
statB
=
connB
.
createStatement
();
statB
.
execute
(
"insert into test values(1, 'Hallo'), (2, 'Welt')"
);
statB
.
execute
(
"update test set data = 'Hallo!' where id = 1"
);
statB
.
execute
(
"delete from test where id = 2"
);
rs
=
statA
.
executeQuery
(
"select * from test"
);
while
(
rs
.
next
())
{
System
.
out
.
println
(
"a: "
+
rs
.
getInt
(
1
)
+
"/"
+
rs
.
getString
(
2
));
}
rs
=
statB
.
executeQuery
(
"select * from test"
);
while
(
rs
.
next
())
{
System
.
out
.
println
(
"b: "
+
rs
.
getInt
(
1
)
+
"/"
+
rs
.
getString
(
2
));
}
connA
.
close
();
connB
.
close
();
rs
=
stat
.
executeQuery
(
"select * from test_data"
);
while
(
rs
.
next
())
{
System
.
out
.
println
(
rs
.
getInt
(
1
)
+
"/"
+
rs
.
getString
(
2
)
+
"/"
+
rs
.
getString
(
3
));
}
conn
.
close
();
}
public
void
init
(
Connection
conn
,
String
schemaName
,
String
triggerName
,
String
tableName
,
boolean
before
,
int
type
)
throws
SQLException
{
prepDelete
=
conn
.
prepareStatement
(
"delete from test_data where id = ? and user = ?"
);
prepInsert
=
conn
.
prepareStatement
(
"insert into test_data values(?, ?, ?)"
);
super
.
init
(
conn
,
schemaName
,
triggerName
,
tableName
,
before
,
type
);
}
public
void
fire
(
Connection
conn
,
ResultSet
oldRow
,
ResultSet
newRow
)
throws
SQLException
{
String
user
=
conn
.
getMetaData
().
getUserName
();
if
(
oldRow
!=
null
&&
oldRow
.
next
())
{
prepDelete
.
setInt
(
1
,
oldRow
.
getInt
(
1
));
prepDelete
.
setString
(
2
,
user
);
int
deleted
=
prepDelete
.
executeUpdate
();
if
(
deleted
==
0
&&
newRow
!=
null
)
{
// update:
// if deleting failed, insert must fail as well
newRow
=
null
;
}
}
if
(
newRow
!=
null
&&
newRow
.
next
())
{
prepInsert
.
setInt
(
1
,
newRow
.
getInt
(
1
));
prepInsert
.
setString
(
2
,
user
);
prepInsert
.
setString
(
3
,
newRow
.
getString
(
2
));
prepInsert
.
executeUpdate
();
}
}
}
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/unit/TestSampleApps.java
浏览文件 @
8b27f983
...
...
@@ -87,6 +87,12 @@ public class TestSampleApps extends TestBase {
"create the zip file...\n"
+
"open the database from the zip file..."
,
org
.
h2
.
samples
.
ReadOnlyDatabaseInZip
.
class
);
testApp
(
"a: 1/Hello!\n"
+
"b: 1/Hallo!\n"
+
"1/A/Hello!\n"
+
"1/B/Hallo!"
,
org
.
h2
.
samples
.
RowAccessRights
.
class
);
// tools
testApp
(
"Allows changing the database file encryption password or algorithm*"
,
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论