Изменение владельца таблицы
Я пытаюсь изменить владельца таблицы:
sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'
Но при выполнении я получаю сообщение об ошибке:
Msg 15001, уровень 16, состояние 1, процедура sp_changeobjectowner, строка 62
Объект 'OWNER.TABLENAME' не существует или не является действительным объектом для эта операция.
Ответы
Ответ 1
Правильный способ сделать это в SQL Server 2005 и выше - это перестать думать о префиксе как о "владельце". Процедура sp_changeobjectowner
была устарела со времен SQL Server 2005, и вместо этого вы должны использовать DDL схемы, например:
ALTER SCHEMA dbo TRANSFER [current_owner].tablename;
Чтобы проверить текущий "владелец" (это может возвращать несколько строк, если в нескольких схемах есть несколько tablename
):
SELECT s.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
ON s.[schema_id] = t.[schema_id]
WHERE t.name = N'tablename';
Также убедитесь, что вы правильно произносите объект. В случае чувствительной к регистру сортировки, например, tablename
и tablename
не являются одним и тем же объектом, и его использование с помощью InCorrEcT CaSe также может привести к этой ошибке.
Ответ 2
Ваше утверждение верное:
EXEC sp_changeobjectowner '<owner>.<tableName>', '<newOwner>'
Если ошибка произошла, попробуйте проверить, кто является текущим владельцем таблицы:
EXEC sp_table_privileges '<tableName>'
Ответ 3
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''', ''dbo'' ' FROM sys.objects WHERE type IN ('U','P','V','FN')
Применить следующие шаги
(1) Запустить следующий запрос в Sql Prompt
(2) Скопируйте результат и снова вставьте в новый запрос Sql и снова выполните
Это владелец изменений ваших таблиц, представлений, хранимых процедур и функций.
Ответ 4
Если вы отбрасываете таблицу, это опция, вы можете отбросить ее и воссоздать под нужным пользователем. Просто укажите dbo в create script. Например:
USE [X]
GO
/****** Object: Table [dbo].[TableName] Script Date: 4/21/2014 1:26:37 PM ******/
CREATE TABLE [dbo].[TableName](
[Field1] [bigint] NOT NULL,
[Field2] [nvarchar](50) NOT NULL,
[Field3] [datetime] NOT NULL
) ON [PRIMARY]
GO
Ответ 5
Чтобы охватить случай, когда таблица существует в построенном имени схемы, например "Common" (это не связано с именем пользователя), необходимо изменить владельца схемы.
alter authorization on schema::Common TO dbo;
Это изменит объекты в схеме на указанный владелец dbo и сохранит таблицу в "Common".
Перечислить владельцев схем:
select db_name() as Db,
sch.name as SchemaName,
u.Name as Owner
from sys.schemas sch
join sys.sysusers u
on u.uid = sch.principal_id;