Подтвердить что ты не робот

Изменение владельца таблицы

Я пытаюсь изменить владельца таблицы:

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'

Но при выполнении я получаю сообщение об ошибке:

Msg 15001, уровень 16, состояние 1, процедура sp_changeobjectowner, строка 62
Объект 'OWNER.TABLENAME' не существует или не является действительным объектом для эта операция.

4b9b3361

Ответ 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;