要改变的是你登录用户的权限,而不一定是cxk的权限。

解决方案 »

  1.   

    應該這樣寫SELECT * FROM  opendatasource('sqloledb','data source=CWAPPTEST;user ID=用戶名;password=12345').YGCWDB20_NMXJ.cxk.Z_TABZT
      

  2.   

    我用的是sp_addlinkedserver,用sa就可以,但是用cxk就不行
    还需要加什么权限码?
      

  3.   

    SELECT * FROM  [CWAPPTEST].YGCWDB20_NMXJ.cxk.Z_TABZT
    在你的的这个查询语句中:cxk是数据库中的用户名,对其赋予权限:(这个在你的服务器上做)
    先用sa登录:
    grant SELECT ,INESRT,UPDATE,DELETE on Z_TABZT to cxk
    然后做登录与数据库用户的映射:
    exec sp_grantdbaccess '服务器上的登录','cxk'
    在你的客户端:
    创建连接服务器:
    exec sp_addlinkedserver '[CWAPPTEST]','','SQLOLEDB','服务器的IP'
    exec sp_addlinkedsrvlogin '[CWAPPTEST]','false','你的登录','服务器上的登录','服务器上的登录密码'
    分布式查询:
    select * from [CWAPPTEST].YGCWDB20_NMXJ.cxk.Z_TABZT

    select * from openquery([CWAPPTEST],'select * from YGCWDB20_NMXJ.cxk.Z_TABZT')
      

  4.   

    SELECT * FROM  [CWAPPTEST].YGCWDB20_NMXJ.cxk.Z_TABZTcxk 是指表的所有者,而不是登录的用户,执行这个语句的权限是由登录的用户权限决定,而不是 cxk
      

  5.   

    我按照上面的试过了 
    加完权限, 
    用cxk用户登陆,用SELECT * FROM [CXK].PUBS.dbo.authors,可以查询成功 
    但是 
    用 
    SELECT * FROM [CXK].PUBS.CXK.authors 
    不成功提示 服务器: 消息 208,级别 16,状态 1,行 1 
    对象名 'PUBS.CXK.authors' 无效。 
    代码如下: use pubs 
    go grant SELECT ,INSERT,UPDATE,DELETE on authors to cxk 
    exec sp_grantdbaccess 'CXK','CXK' 
    DECLARE 
    @SERVERNAME VARCHAR(20),--核算服务器名 
    @DBNAME VARCHAR(20), --核算数据库名 
    @USERNAME VARCHAR(20), --核算数据库用户名 
    @PW VARCHAR(20) --核算数据库密码 SET @SERVERNAME ='CXK' 
    SET @DBNAME ='PUBS' 
    SET @USERNAME ='CXK' 
    SET @PW ='' ---------------------------增加LINKSERVER----------------------------- 
    DECLARE 
    @BSNEW INT, 
    @SQL VARCHAR(8000), 
    @REPLSVR VARCHAR(20), 
    @UNAME VARCHAR(20), 
    @LINKSTR VARCHAR(60) SELECT @BSNEW = COUNT(*) FROM MASTER.DBO.SYSSERVERS WHERE SRVNAME = @SERVERNAME 
    IF (@BSNEW<>1) OR ( @BSNEW IS NULL) 
    BEGIN 
    SET @SQL = 'EXEC SP_ADDLINKEDSERVER @SERVER=''' + @SERVERNAME + '''' 
    EXEC(@SQL) 
    END SET @SQL = 'EXEC SP_ADDLINKEDSRVLOGIN @RMTSRVNAME =''' + @SERVERNAME+ ''',@USESELF = FALSE,@RMTUSER = ''' + @USERNAME + ''',@RMTPASSWORD = ''' + @PW + '''' 
    EXEC(@SQL) SET @REPLSVR = ' [' + @SERVERNAME + ']' 
    IF UPPER(@USERNAME) = 'SA' 
    SET @UNAME = 'DBO' 
    ELSE 
    SET @UNAME = @USERNAME 
    SET @LINKSTR = @REPLSVR + '.' + @DBNAME + '.' + @UNAME + '.' 
    ----------------------------------------------------------------------- 
    PRINT @LINKSTR SELECT * FROM [CXK].PUBS.CXK.authors 
      

  6.   

    我想前面讲得已经很清楚了[CXK].PUBS.dbo.authors这里的对象依次是:
    链接服务器名.数据库名.所有者名.对象名注意倒数第二个是所有者名,不是登录的用户名在你的数据库 PUBS 中,authors 的所有者是 dbo ,而不是用户 CXK所以:
    SELECT * FROM [CXK].PUBS.dbo.authors
    有效SELECT * FROM [CXK].PUBS.CXK.authors 
    无效,因为根本没有 所有者为 CXK 的 authors 表
    而楼主一直没有搞清楚对象的所有者与登录用户的区别