post icon

Cambiar el propietario de un objeto en SQL Server

En SQL Server todos los objetos siempre tienen un dueño (owner) el cual tiene poder absoluto sobre el mismo, pero eso no limita que otros usuarios tengan poder sobre un objeto dado, tendrán permisos si el dueño o un usuario con poder de otorgar permisos (otorgado originalmente por el dueño o cualquier usuario que pertenezca a las funciones fijas de base de datos db_owner o a las funciones fijas de base de datos db_ddladmindb_securityadmin).

Hay momentos en donde lo que buscamos es cambiar directamente de dueño un objeto, esto puede darse por varios motivos, eliminación del dueño (hay que tener que tener cuidado con esto o eliminaremos todos lo objetos que pertenezcan al dueño), asignación rápida de permisos completos de un usuario sobre el objeto, con respecto a si aplicamos este procedimiento por este motivo, debemos tener muy en cuenta que todos los permisos que tenía en propietario original, serán revocados, por lo tanto es conveniente extraer un script de los permisos del mismo, para volver a ejecutarlo si deseamos que siga teniendo los permisos luego.

El proceso en la versión 2000 se hace de distinto modo que en la 2005/2008, ya que fueron cambiados fuertemente las estructuras internas, para mejorar la seguridad del mismo.

En SQL Server 2000

Sintaxis:

1
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

Ejemplo:

1
2
EXEC sp_changeobjectowner @objname='libroDiario', @newowner='Contabilidad';
GO

En SQL Server 2005/2008

Sintaxis:

1
2
3
4
5
6
ALTER SCHEMA schema_name
      TRANSFER [  :: ] securable_name [;]
 ::=
    {
        Object | Type | XML Schema Collection
    }

Ejemplo:

1
2
ALTER SCHEMA Contabilidad TRANSFER libroDiario;
GO

Comentarios desde Facebook:

  1. avatar
    Mike PARAGUAY Mozilla Firefox Windows
    14 Mayo 2010 at 14:08 #

    Este Query me funciono en SQL SERVER 2000/2005

     

    <pre lang="tsql">DECLARE @old sysname, @new sysname, @sql varchar(1000)

    SELECT

    @old = 'wisdom'

    , @new = 'dbo'

    , @sql = '

    IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES

    WHERE

    QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''

    AND TABLE_SCHEMA = ''' + @old + '''

    )

    EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

    EXECUTE sp_MSforeachtable @sql

    </pre>

  2. avatar
    Mike _m/ PARAGUAY Mozilla Firefox Windows
    14 Mayo 2010 at 06:55 #

    La consulta siguiente sirvio para cambiar el owner en SQL Server 2000

    <pre lang="tsql">DECLARE @old sysname, @new sysname, @sql varchar(1000)

    SELECT

    @old = 'Nombrepropietarioacambiar'

    , @new = 'nombredenuevopropietario'

    , @sql = '

    IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES

    WHERE

    QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''

    AND TABLE_SCHEMA = ''' + @old + '''

    )

    EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

    EXECUTE sp_MSforeachtable @sql </pre>

  3. avatar
    DIOCaraballo PARAGUAY Google Chrome Windows
    14 Mayo 2010 at 04:44 #

    El siguiente es un SELECT que había hecho de forma a facilitarme cambiar de una sola vez el dueño en tablas, asignando como propietario de las mismas a DBO. Espero les sea útil.

    <pre lang="tsql">SELECT 'EXEC SP_CHANGEOBJECTOWNER ''' + U.name + '.' + RTRIM(O.name) + ''', dbo',*

    FROM SYSOBJECTS O

    JOIN SYSUSERS U ON O.uid = U.uid

    WHERE U.name != 'dbo'

    AND O.xtype IN ('U','V','P')

    AND O.status > 0</pre>

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      14 Mayo 2010 at 05:23 #

      Bien corto y demasiado práctico 🙂 en su momento lo usaré..

Responder