使用只能看到 sa 的用户更改数据库所有权

ACu*_*dio 3 sql-server permissions

首先,我要感谢社区创建了这样一个足智多谋的论坛。我多年来一直在使用 StackOverflow,最近也在 SE 上使用 dba,你很棒。我的大部分问题都是有人问过的,或者一些评论让我得到了答案,所以非常感谢!

话虽如此,我遇到了一个我认为不常见的问题。案例是:我被要求创建一个数据库,该数据库将作为新系统的中央数据库。该数据库将包含我工作的公司需要的信息(如付款信息、联系人、客户的电子邮件等)。

之后,每个新客户都将获得一个干净的数据库(他们将与我们的软件一起使用)。该数据库应该只有一个用户,并且该用户只能查看并连接到该特定数据库。这个数据库应该是部分包含的,用户不能有任何现有实例登录的链接。此外,由于某些原因,在新客户在我们的网站上完成注册后,创建数据库的过程应该通过一个过程完成,由某个事件触发。并且运行此过程的用户(我将称之为“创建者”)除了“数据库创建”之外不得拥有任何权限。

我已经介绍了这些步骤,创建一个用户,该用户只有权运行该过程并创建一个数据库。

问题是这个 CREATOR 用户是它创建的数据库的 db_owner。我想将所有权更改为 sa(或任何其他登录名,真的),但我不能,因为 CREATOR 除了自己和 sa 之外看不到任何人。我知道这是因为我不允许它看到其他登录信息。

那么,问题来了。如何在不违反这些规则的情况下将所有创建的 dbs 的所有权更改为 sa(我可以看到的那个),或者如何授予 CREATOR 查看(而不是删除或创建)其他用户的权限并更改每个用户的 db 所有者他创建的数据库?

提前致谢!

Low*_*n M 5

可能不太好,但您可以在数据库创建时使用触发器,该触发器作为您选择的特权用户执行:

CREATE TRIGGER [database_setup]

    ON ALL SERVER
    WITH EXECUTE AS 'privuser'
    FOR CREATE_DATABASE
    AS
    BEGIN
    SET NOCOUNT ON
    DECLARE @db nvarchar(100)
    DECLARE @sql nvarchar(MAX)
    DECLARE @data XML
    SET @data = EVENTDATA()

    SELECT @db = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(100)');
    SELECT @sql = ('ALTER AUTHORIZATION ON DATABASE::' + @db + ' TO sa;');
    sp_executesql @sql;
    END
GO

ENABLE TRIGGER [database_setup] ON ALL SERVER
GO
Run Code Online (Sandbox Code Playgroud)