如何解决引用对象时,必须加所有者(owner)的问题

SQL孤立用户解决
本文介绍了解决SQL Server中孤立用户的问题,包括如何判断是否存在孤立用户、查询孤立用户的方法及修复步骤。适用于SQL Server 2000及2005版本。

问题描述:

从别处copy来一个数据库DB,附加后,对象的所有者不是Admini,每次查询时必需写select * from Admini.***才能查到。有什么方法不用前面的Admini吗(在不修改所有者的前提下)?注:

已经在“安全性-登陆”下面也新建了一个Admini用户,默认数据库设置为DB,权限足够,但在查询分析器下用Admini登陆,查询时还是要写Admini前缀,否则就提示对象名无效

问题解决方法:

如果是用的是sql 2000的话,用某个用户登录, 不指定所有者的话, 访问对象的时候, 默认的所有者就是当前登录用户

如果是2005的话, 在数据的安全性--用户--右键你的用户admin--属性, 看看默认构架是什么, 这个默认架构决定当你访问对象时, 不指定所有者的话, 使用那个所有者(sql 2005, owner变成构架了)

会导致与上面的说法不匹配的异常情况:

如果在数据库DB中,Admini是孤立用户的话,则情况会与上面描述的有出入(附加或者恢复数据库很容易出现孤立用户),即引用对象时必须指定所有者。孤立用户的表现是:只能创建Admini登录, 并通过服务器角色给其分配对DB的权限,或者是在DB中建立名称不是Admini的用户与登录关联。

要查询DB中的孤立用户情况,执行下面的语句:

USE DB

GO

EXEC sp_change_users_login 'Report'

解决孤立用户的方法:

解决这种异常只要解决掉孤立用户,在确定了Admini是孤立用户后,可以执行下面的语句来解决:

USE DB

GO

-- 修复孤立用户

EXEC sp_change_users_login 'Auto_Fix', 'Admin', NULL, '密码';

-- 这个密码是指, 如果没有事先建立admin 这个登录的话, sql自动创建登录时, 为该登录分配的密码

-- 授予在DB 中的相关权限

EXEC sp_addrolemember 'db_owner', 'Admin'

在 Oracle 数据库中,更改表的所有者owner)实际上是将表从一个用户(Schema)移动到另一个用户(Schema)。这需要执行一系列操作来确保数据完整性、权限和依赖对象的正确性。以下是实现这一目标的具体方法[^3]。 ### 方法一:使用 `EXP/IMP` 或 `EXPDP/IMPDP` 通过导出和导入工具可以轻松地将表从一个用户移动到另一个用户。具体步骤如下: 1. 使用 `EXP` 或 `EXPDP` 导出原用户的表。 2. 删除原用户的表(如果不需要保留)。 3. 使用 `IMP` 或 `IMPDP` 导入到目标用户下。 需要注意的是,在导入必须指定 `FROMUSER` 和 `TOUSER` 参数以完成所有权转移。例如: ```bash imp system/password@database fromuser=old_user touser=new_user file=export.dmp ``` 这种方法适用于简单场景,但可能会遇到依赖对象(如索引、触发器等)无法自动迁移的问题[^2]。 --- ### 方法二:直接使用 `ALTER TABLE MOVE` 另一种更高效的方法是直接修改表的所有权。可以通过以下步骤实现: 1. 创建目标用户(如果尚未创建)。 ```sql CREATE USER new_owner IDENTIFIED BY password; GRANT CONNECT, RESOURCE TO new_owner; ``` 2. 将表的所有权转移到目标用户。 ```sql ALTER TABLE old_owner.table_name RENAME TO new_owner.table_name; ``` 3. 如果表有依赖对象(如索引、触发器),需要重新编译或重建这些对象。 ```sql ALTER INDEX old_owner.index_name REBUILD; ``` 4. 确保目标用户具有访问表空间的权限。 ```sql ALTER USER new_owner QUOTA UNLIMITED ON tablespace_name; ``` 此方法的优点是无需导出和导入数据,直接在数据库内部完成所有权转移[^3]。 --- ### 方法三:使用 `DBMS_REDEFINITION` 对于大型表或复杂依赖关系的表,可以使用 Oracle 提供的在线重定义工具 `DBMS_REDEFINITION`。该工具允许在不影响业务的情况下完成表的所有权转移。 1. 检查表是否支持在线重定义。 ```sql BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('old_owner', 'table_name', DBMS_REDEFINITION.CONS_USE_PK); END; ``` 2. 开始在线重定义过程。 ```sql EXEC DBMS_REDEFINITION.START_REDEF_TABLE('old_owner', 'table_name', 'new_owner.table_name'); ``` 3. 同步中间数据。 ```sql EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('old_owner', 'table_name', 'new_owner.table_name'); ``` 4. 完成重定义。 ```sql EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('old_owner', 'table_name', 'new_owner.table_name'); ``` 这种方法适合对性能要求较高的场景,同能够保证数据一致性[^3]。 --- ### 注意事项 - 在转移表所有权之前,请确保目标用户有足够的权限访问相关表空间。 - 如果表有外键约束,可能需要先禁用约束,然后再重新启用。 - 转移过程中可能会涉及视图、存储过程等依赖对象,需逐一检查并更新引用。 ```sql -- 示例:更新视图中的引用 CREATE OR REPLACE VIEW new_owner.view_name AS SELECT * FROM new_owner.table_name; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值