如何在2005的sys.databases视图建立这样的触发器呢

e66478 2008-09-05 10:53:27
我新建立了一个数据库用户sq_uu指定到sq_uu数据库,然后用它远程连接到数据库服务器上的时候看的到其他数据库。虽然没有权限。能不能在sys.databases视图建立触发器,让这个用户连接上来只有获得sys.databases 列中DBID自己的那个值呢,或者NAME也可以啊
...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
e66478 2008-09-10
  • 打赏
  • 举报
回复
很多人都是说能看到就看到了。当登入上来的时候有些人不明白怎么回事,找自己的数据库都找不到。master无所谓看不看的到了。只要用户的数据库看不到就行了。远程登入只看到系统的数据库没权限操作和看到自己拥有权限的数据库就可以了。不能看到其他用户的数据库。这个问题搞了很久太难了。
bwu851 2008-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fcuandy 的回复:]
楼主的意思是说:
比如我有库 dba,dbb,dbc

用户user1只有dba库的相关权限,当他连到服务器上时,不让他看到dbb,dbc?
[/Quote]

偶知道, 但是系统数据库只要你能login就能看到的....其他数据库还能做到LZ所说的.

不过, 即使能看到又能怎么样? 没权限也就只能看看了.
e66478 2008-09-05
  • 打赏
  • 举报
回复
不知道有没人这样试过,或者你们没这么多资源吧,用两台电脑安装SQL数据库。不要用SA用户,自己建立其他的用户,在A数据库服务器上建立多个数据库,随便写数据库名。从A连接到B数据库服务器上。如果只看的到自己有权限的那个数据库就OK了。如果看到所有的数据库,包括master数据库,那就失败了。
bwu851 2008-09-05
  • 打赏
  • 举报
回复
LZ到底是干什么呀? DBID和DBNAME都是简单运行一下函数就可以的了....还要trigger????真复杂呀, 要那么复杂干嘛??
bwu851 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 e66478 的回复:]
2楼老大我是想这个用户连接到数据库上只看到自己那个数据库。所以想在触发器这能否实现,或者能否设定个触发器,让所有的SQL普通用户都只能获得自己的DB_name 真是万分感谢
[/Quote]

只看到自己的数据库 --- 这是权限的问题. 你在建用户名是选缺省的数据库就是该用户连接上服务器所能看到的数据库.
e66478 2008-09-05
  • 打赏
  • 举报
回复
在微软教学书看到

元数据可见性故障排除

使用本主题可以解决查看元数据时出现的问题。

用户只能查看用户拥有的元数据或用户被授予其某些权限的元数据。此策略阻止拥有最低特权的用户查看 SQL Server 实例中所有对象的元数据。有关元数据可见性的详细信息,请参阅元数据可见性配置。

允许用户查看元数据
若要允许具有最低特权的用户查看所有元数据,请运行下列语句之一:

GRANT VIEW ANY DEFINITION TO public;
此语句将覆盖实例级的元数据可见性限制。实例中的所有元数据对 public 都将是可见的。

GRANT VIEW DEFINITION TO public;
此语句将覆盖数据库级的元数据可见性限制。数据库中的所有元数据对 public 都将是可见的。

GRANT VIEW DEFINITION ON SCHEMA :: <schema_name> TO public;
此语句将覆盖架构级的元数据可见性限制。架构中的所有元数据对 public 都将是可见的。

GRANT VIEW DEFINITION ON OBJECT :: <object_name> TO public;
此语句将覆盖对象级的元数据可见性限制。对象的所有元数据对 public 都将是可见的。如果对象是一个表,则表的所有列、索引、统计信息和约束对 public 都将是可见的。此行为也适用于 GRANT VIEW DEFINITION ON ASSEMBLY 和其他类似 GRANT 语句。

若要允许具有最低特权的特定用户或某个角色查看所有元数据,请使用具体的用户名或角色名作为被授权者,而不要使用 public。

允许用户彼此查看
默认情况下,具有最低特权的用户无法在 sys.database_principals 和 sys.server_principals 目录视图中看到其他用户。这意味着拥有表的最低特权用户无法查看他们可能想要授予其权限的其他用户。若要允许具有最低特权的用户 user_X 查看另一个用户 user_Y,可以运行以下 GRANT 语句:

GRANT VIEW DEFINITION ON USER :: <user_Y> TO <user_X>

必须为每个用户运行此语句。可以通过创建与以下触发器类似的 DDL 触发器来自动完成此过程:

复制代码
CREATE TRIGGER grant_view_definition_on_principal ON DATABASE
FOR CREATE_USER, CREATE_ROLE
AS
DECLARE @event_type sysname, @principal_name sysname, @sql nvarchar(max);
SELECT @event_type = eventdata().value('(/EVENT_INSTANCE/EventType) [1]','sysname');
SELECT @principal_name = eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname');
IF (@event_type = 'CREATE_USER')
SELECT @sql = 'GRANT VIEW DEFINITION ON USER :: ' + @principal_name + ' TO PUBLIC ' ;
ELSE
SELECT @sql = 'GRANT VIEW DEFINITION ON ROLE :: ' + @principal_name + ' TO PUBLIC ' ;
EXEC (@sql) ;
GO
e66478 2008-09-05
  • 打赏
  • 举报
回复
2楼老大我是想这个用户连接到数据库上只看到自己那个数据库。所以想在触发器这能否实现,或者能否设定个触发器,让所有的SQL普通用户都只能获得自己的DB_name 真是万分感谢
bwu851 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 e66478 的帖子:]
我新建立了一个数据库用户sq_uu指定到sq_uu数据库,然后用它远程连接到数据库服务器上的时候看的到其他数据库。虽然没有权限。能不能在sys.databases视图建立触发器,让这个用户连接上来只有获得sys.databases 列中DBID自己的那个值呢,或者NAME也可以啊
[/Quote]

SQL 2005已经不让修改系统表什么的了.

要想获得DBID和DB_Name, 直接用DB_ID()和DB_NAME()函数就行了.
水族杰纶 2008-09-05
  • 打赏
  • 举报
回复
关注~~
fcuandy 2008-09-05
  • 打赏
  • 举报
回复
楼主的意思是说:
比如我有库 dba,dbb,dbc

用户user1只有dba库的相关权限,当他连到服务器上时,不让他看到dbb,dbc?
bwu851 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 e66478 的回复:]
不知道有没人这样试过,或者你们没这么多资源吧,用两台电脑安装SQL数据库。不要用SA用户,自己建立其他的用户,在A数据库服务器上建立多个数据库,随便写数据库名。从A连接到B数据库服务器上。如果只看的到自己有权限的那个数据库就OK了。如果看到所有的数据库,包括master数据库,那就失败了。
[/Quote]

哦? 系统数据库是个人就能看到.....其他的数据库就如你所说的.

(另外, 你公司有多少服务器呀?(这里特指SQL SERVER) 你管几台? 你见过并要管理100台以上的SQL SERVER吗?)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧