EXECUTE AS USER = 'dbo' Выдает ошибку. Зачем?

Когда я создаю новую базу данных, и я выполняю SELECT user он возвращает мне, что пользователь является dbo .

Поэтому я создал нового пользователя и выполнил код, созданный этим пользователем. Но когда вы пытаетесь изменить его снова на dbo , это вызывает у меня ошибку, которой она не существует, но я вижу ее. Почему это происходит? Я что-то делаю неправильно?

 CREATE USER TestUser WITHOUT LOGIN SELECT user --Returns dbo SELECT * FROM sys.database_principals --I can see both, dbo and TestUser and some other users of the system EXECUTE AS user = 'TestUser' SELECT user --Returns TestUser EXECUTE AS user = 'dbo'; -- Says that it doesn't exist 

Ошибка, которая вызывает:

Не может выполняться в качестве принципала базы данных, поскольку основной «dbo» не существует, этот тип принципала не может быть выдан за личность или у вас нет разрешения.

Использование Microsoft SQL Server Management Studio 14.0.17119.0

Потому что «у вас нет разрешения». Все после EXECUTE AS выполняется как новый пользователь, включая попытку выдать себя за новых пользователей, а TestUser , не являясь системным администратором, не может выдавать себя за dbo . REVERT вместо этого.

Ключ находится в сообщении об ошибке «этот тип принципала не может выдаваться». В принципе, «dbo» пользователя следует рассматривать как псевдоним или роль (владелец базы данных). Итак, когда вы создаете базу данных / таблицу / etc, используя свой логин, у вас есть привилегия владельца базы данных. Например, если вы входите в систему как пользователь и создаете таблицу, полное имя таблицы – DataBaseName.dbo.TableName.

Зачем вам нужно выполнять как «dbo»? Было бы лучше не назначать права владельца базы данных кучам пользователей, а скорее поддерживать доступ пользователей / роли / разрешений.

Interesting Posts

Должен ли я использовать int32 или int64 для первичных ключей в моей базе данных SQL Server?

Простой запрос SQL Server о поиске записи с использованием двух условий

Уникальные, но все же простые идентификаторы базы данных в SQL Server

Как получить UserName из java.sql.Connection?

Можно ли постоянно использовать контекст платформы Entity Framework в коде?

Ярлык для выполнения последнего запроса в SSMS

Преобразование строки в значение datetime в LINQ

Лучший формат валюты в базе данных

Почему параметризованная версия этого запроса выполняется медленнее, чем непараметрированная версия?

Как определить строку ошибки при использовании пакетной вставки (INSERT INTO table2 SELECT * FROM table1)

Подключение к базе данных Sql Server 2014 в Azure VM

IDbCommand назвал параметры как для MySQL, так и для SQL Server

Путь выполнения SQL Server -SP хранится в Stack?

ВЫБЕРИТЕ несколько строк из одного столбца в одну строку

Найти несколько обновленных столбцов в триггере

Давайте будем гением компьютера.