【问题标题】:SQL Grant other user db_owner when creating databaseSQL 在创建数据库时授予其他用户 db_owner
【发布时间】:2013-04-02 12:28:47
【问题描述】:

我想设置一个 MS SQL 触发器(或其他机制),它会自动授予某些组 db_owner 权限。

希望我们的用户在 SQL Server 上拥有 db_admin,相反,我只想授予他们 db_creator 但只要有人创建了一个数据库,其他用户也应该可以访问这个数据库。

我已尝试创建 SQL 触发器:

USE master
GO
CREATE TRIGGER trg_DDL_CreateDatabase
ON ALL SERVER
FOR CREATE_DATABASE
AS

DECLARE @databaseName varchar(max)
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(255)'))

EXEC ('USE [' + @databaseName + ']' )

IF IS_MEMBER ('DOMAIN\GROUP') = 1
EXEC sp_addrolemember N'db_owner', N'DOMAIN\SOMEGROUP'
ELSE
EXEC sp_addrolemember N'db_owner', N'DOMAIN\SOMEOTHERGROUP'

GO

由于我无法在触发器中使用 USE 语句,因此我尝试使用 EXEC ('USE [' + @databaseName + ']' ) 方法 - 但是它也不起作用。

有什么建议吗?

编辑:如果我可以根据组成员身份授予不同的权限,那就太棒了。例如,用户是组 A 的成员,则将 A 添加到 db_owner,如果 B,则添加 B、C 和 E 等。

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案1】:

    每个数据库都创建为[model] 的副本。您在[model] 中申请的任何用户、组和授权都将自动复制到任何新创建的数据库中。请注意,这并不涉及附加的数据库。

    如果您想通过 DDL 触发器执行此操作,您需要对 整个 批处理使用动态 sql:

    CREATE TRIGGER trg_DDL_CreateDatabase
    ON ALL SERVER
    FOR CREATE_DATABASE
    AS
    DECLARE @databaseName sysname;
    SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname'));
    declare @sql nvarchar(max);
    set @sql = N'USE ' + quotename(@databaseName) + N';
    IF IS_MEMBER (''DOMAIN\GROUP'') = 1
    EXEC sp_addrolemember N''db_owner'', N''DOMAIN\SOMEGROUP''
    ELSE
    EXEC sp_addrolemember N''db_owner'', N''DOMAIN\SOMEOTHERGROUP'';';
    exec sp_executesql @sql;
    

    作为良好做法,使用QUOTENAME() 正确转义名称。在提取(xml 方法)和存储(变量类型)中使用sysname 作为数据库名称类型。因为你的代码很容易被 db_creator 利用,通过 SQL 注入将自己提升为系统管理员(创建一个适当的数据库名称并 pwn 你)。

    【讨论】:

    • 哦,谢谢,这是个好主意!但是如果我想执行一些基本的逻辑,比如根据组成员授予权限。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 2021-02-05
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多