那第一种方法怎么能保证用户帐号和用户表里的信息的一致性呢?
比如说我用sp_addrolemember建立一个数据库用户A,同时这个用户对
应与雇员表里的employeeA,那么我必须建立一个记录用来存储这个关系,
这就需要sp_addrolemember和建立关系的insert语句在同一个事务中实现,
可是sp_addrolemember是不能够放在事务处理中的,这怎么办呢?

解决方案 »

  1.   


    begin tranexec ('master..sp_addrolemember ..........')
    insert into ..........
    if @error <> 0 goto errorcommit tran
    returnerror:
    rollback tran
    return
      

  2.   

    nboys() :你试过么?我试过,就是不行啊
    sql server的联机帮助上这么说的:
    在用户定义的事务中不能使用 sp_addrolemember。
      

  3.   

    1。 只创建一个 sa 级别的用户,用来做系统维护(如,创建别的用户)
    2。 其它用户都创建在 public 组下,拥有基本权限
    3。 用户密码在表中以加密形式保存
    4。 创建一个用户权限表,指定用户对各种数据的详细权限
      

  4.   

    cdshelf(cdshelf):
    还是老问题
    2。其它用户都创建在 public 组下,拥有基本权限
    这个怎么做?
    用系统的存储过程创建么?由于无法用事务,怎么保证它和权限表的一致性?
    如果放在自定义的表里,那么用户用什么帐号来登录数据库呢?
      

  5.   

    EXEC sp_addlogin 'Albert', 'food', 'databaseName'   --添加登陆
    GO
    EXEC sp_adduser 'Albert', 'Albert', 'public'        --赋予Albert public 的权限
    GO
    EXEC sp_addrolemember 'db_owner', 'Albert'          --把Albert添加到db_owner角色中
    GO
    EXEC sp_droprolemember 'db_owner', 'Albert'         --从db_owner角色中删除Albert
    GO
    EXEC sp_dropuser 'Albert'                           --从该数据库中删除Albert
    GO
    EXEC sp_droplogin 'Albert'                          --从登陆中删除Albert
      

  6.   

    其它用户都创建在 public 组下,拥有基本权限
    这个怎么做?刚建立的登陆用户本来就属于public组,只要把这个用户添加到一个数据库,本身就拥有public的权限
      

  7.   

    采用sql server自带的安全管理,每一个操作员都对应于数据库的一个账号,这样
    安全管理就可以交给数据库来管,当然,应用程序需要维护账号和操作员信息的一致性。但是,数据库中建立用户组和用户的存储过程不能在用户事务中使用,这样一致性维护就有可能有问题。
    可以隔一段时间,比如五分钟,检查表中记录有没有变化,如果有变化,就执行存储过程create proc test
    as
    EXEC sp_addlogin 'Albert', 'food', 'TPV-MP'
    EXEC sp_adduser 'Albert', 'Albert', 'public'
    EXEC sp_addrolemember 'db_owner', 'Albert'
    EXEC sp_droprolemember 'db_owner', 'Albert'
    EXEC sp_dropuser 'Albert'
    EXEC sp_droplogin 'Albert'
      

  8.   

    我考虑自己把
    sp_addlogin
    sp_addrolemember 
    这样的存储过程改写一下,让它们能够在用户定义的事务中用
    这样做兼容性似乎不够好,而且微软出于性能考虑,也不推荐
    把addlogin这样的事情放在事务中处理,但是我想像增加用户
    帐号这样的事情毕竟不常做,性能损失点倒也无所谓,就是兼
    容性比较差让人觉得不爽。
    各位有什么看法那?