sql - permission - ¿Cómo cambio el esquema db a dbo?
information_schema sql server (10)
Importé un conjunto de tablas de un antiguo servidor sql (2000) en mi base de datos de 2008. Todas las tablas importadas tienen un prefijo con mi nombre de usuario, por ejemplo: jonathan.MovieData
. En las properties
la tabla, enumera jonathan
como el esquema db. Cuando escribo procedimientos almacenados, ahora debo incluir a jonathan.
frente a todos los nombres de la tabla que es confuso.
¿Cómo cambio todas mis tablas para que sean dbo en lugar de jonathan?
Resultado actual: jonathan.MovieData
Resultado deseado: dbo.MovieData
Abra el servidor SQL como cuenta SA y haga clic en nueva consulta después de las consultas
que hacer clic en ejecutar, revertirá todos los esquemas de propiedad a la cuenta SA
alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]
Acabo de publicar esto en una pregunta similar: en SQL Server 2005, ¿cómo cambio el "esquema" de una tabla sin perder ningún dato?
Una ligera mejora a la excelente respuesta de sAeid ...
Agregué un ejecutivo para tener este código auto-ejecutado, y agregué una unión en la parte superior para poder cambiar el esquema de ambas tablas Y procedimientos almacenados:
DECLARE cursore CURSOR FOR
select specific_schema as ''schema'', specific_name AS ''name''
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> ''dbo''
UNION ALL
SELECT TABLE_SCHEMA AS ''schema'', TABLE_NAME AS ''name''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> ''dbo''
DECLARE @schema sysname,
@tab sysname,
@sql varchar(500)
OPEN cursore
FETCH NEXT FROM cursore INTO @schema, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = ''ALTER SCHEMA dbo TRANSFER ['' + @schema + ''].['' + @tab +'']''
PRINT @sql
exec (@sql)
FETCH NEXT FROM cursore INTO @schema, @tab
END
CLOSE cursore
DEALLOCATE cursore
Yo también tuve que restaurar un dbdump, y encontré que el esquema no era dbo - pasé horas tratando de hacer que las transferencias de datos del estudio de gestión de Sql Server o del estudio visual alteraran el esquema de destino ... terminé simplemente ejecutando esto contra el restaurado volcar en el nuevo servidor para obtener las cosas como yo quería.
Manera de hacerlo por una cosa individual:
alterar esquema transferencia dbo jonathan.MovieData
Puede cambiar por lotes esquemas de múltiples objetos de base de datos como se describe en esta publicación:
Cómo cambiar el esquema de todas las tablas, vistas y procedimientos almacenados en MSSQL
Puede ejecutar lo siguiente, que generará un conjunto de sentencias ALTER sCHEMA para todos sus talbes:
SELECT ''ALTER SCHEMA dbo TRANSFER '' + TABLE_SCHEMA + ''.'' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''jonathan''
Luego debe copiar y ejecutar las declaraciones en el analizador de consultas.
Aquí hay un script más antiguo que también lo hará por usted, creo que al cambiar el propietario del objeto. No lo he probado en 2008, sin embargo.
DECLARE @old sysname, @new sysname, @sql varchar(1000)
SELECT
@old = ''jonathan''
, @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
Lo obtuve de este sitio .
También habla de hacer lo mismo para los procesos almacenados si es necesario.
Tuve un problema similar, pero mi esquema tenía una barra invertida. En este caso, incluya los corchetes alrededor del esquema.
ALTER SCHEMA dbo TRANSFER [DOMAIN/jonathan].MovieData;
ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm
ALTER SCHEMA nombre_esquema TRANSFERENCIA nombre_segurable
Mover la tabla del esquema dbo a MySchema:
ALTER SCHEMA MySchema TRANSFER dbo.MyTable
Mover la tabla de MySchema al esquema dbo:
ALTER SCHEMA dbo TRANSFER MySchema.MyTable
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
Vea ALTERAR ESQUEMA .
Sintaxis generalizada:
ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO
Ref: ALTER SCHEMA