SQL Server 2000中系统表的作用
sysaltfiles 主数据库 保存数据库的文件
syscharsets 主数据库 字符集与排序顺序
sysconfigures 主数据库 配置选项
syscurconfigs 主数据库 当前配置选项
sysdatabases 主数据库 服务器中的数据库
syslanguages 主数据库 语言
syslogins 主数据库 登陆帐号信息
sysoledbusers 主数据库 链接服务器登陆信息
sysprocesses 主数据库 进程
sysremotelogins主数据库 远程登录帐号
syscolumns 每个数据库 列
sysconstrains 每个数据库 限制
sysfilegroups 每个数据库 文件组
sysfiles 每个数据库 文件
sysforeignkeys 每个数据库 外部关键字
sysindexs 每个数据库 索引
sysmenbers 每个数据库 角色成员
sysobjects 每个数据库 所有数据库对象
syspermissions 每个数据库 权限
systypes 每个数据库 用户定义数据类型
sysusers 每个数据库 用户
简单的方法可以使用 sp_tables @table_type = "'TABLE'"
但是为了熟悉系统表的使用所以使用以下方式:
使用到的表:
sysusers、sysobjects、syspermissions
获取思路:
获取用户的UID。
select uid from dbo.sysusers where name ='zhang';
获取该用户自己所拥有的表的ID:uid由上边获得
select id from dbo.sysobjects where uid = '5';
获取其他用户授权给它的表:
select id from dbo.syspermissions where grantee = '5';
这样就获取了所有的能访问到的表。
(sa用户特殊用户不适合该方法)
使用SQL实现(可能有更合理的实现方式,请高手指教)
declare @uid char (30);
select @uid = uid from dbo.sysusers where name='zhangyx';
select o.name,u.name from dbo.sysobjects o,dbo.sysusers u where ((o.id in (select id from dbo.syspermissions where grantee = @uid)) or (o.uid = @uid) )and u.uid = o.uid;
也可以写成一条语句
select o.name,u.name from dbo.sysobjects o,dbo.sysusers u where ((o.id in (select id from dbo.syspermissions where grantee = (select uid from dbo.sysusers where name='zhangyx'))) or (o.uid = (select uid from dbo.sysusers where name='zhangyx')) )and u.uid = o.uid and o.xtype = 'U';
通过java实现:
可以使用上面的语句实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.jdbc.sqlserver.SQLServerDriver;
public class Tables {
private Connection conn = null;
/**
* 连接数据库用户名和密码
*/
private String username = "zhangyx";
private String password = "zhangyx";
public Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("找不到数据库需要的类!");
System.exit(1);
}
try {
String dbUrl = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test";
conn = DriverManager.getConnection(dbUrl, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public void close(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (Exception e) {
}
try {
if (st != null)
st.close();
} catch (Exception e) {
}
try {
if (conn != null)
conn.close();
} catch (Exception e) {
}
}
public String getUsername() {
return this.username;
}
public static void main(String[] args) {
Tables table = new Tables();
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String username = table.getUsername();
try {
String sql = "select o.name,u.name from dbo.sysobjects o,dbo.sysusers u where ((o.id in (select id from dbo.syspermissions where grantee = (select uid from dbo.sysusers where name='"
+ username
+ "'))) or (o.uid = (select uid from dbo.sysusers where name='"
+ username + "')) )and u.uid = o.uid and o.xtype = 'U';";
conn = table.getConnection();
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
System.out.println("table_name | user");
while (rs.next()) {
System.out.print(rs.getString(1));
System.out.print(" | ");
System.out.println(rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
table.close(rs, pst, conn);
}
}
}
阅读(3112) | 评论(0) | 转发(0) |