我在开发数据库中有 SQL Server 2008 的需求
- 只有 DBA(数据库所有者)才能创建、更改表。
开发人员不应创建或更改表。
- 开发人员可以创建/更改存储过程/用户定义函数
在 dbo 模式中并且可以执行 SP/UDF。
- 开发人员应该对表进行 SELECT、INSERT、DELETE、UPDATE(
dbo 架构中的表
如何使用 GRANT 语句实现这一点
从Google找到了示例解决方案,但仍然有问题
CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj 987kj//'
CREATE USER testdev
GRANT ALTER ON SCHEMA::dbo TO testdev
GRANT CREATE PROCEDURE TO testdev
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO testdev
CREATE TABLE mysig (a int NOT NULL)
EXECUTE AS USER = 'testdev'
go
CREATE PROCEDURE slaskis AS PRINT 12
go
CREATE TABLE hoppsan(a int NOT NULL) -- FAILS!
go
INSERT mysig (a) VALUES(123)
go
REVERT
go
DROP PROCEDURE slaskis
DROP TABLE mysig
DROP USER testdev
DROP LOGIN testdev
上面的语法能够阻止开发人员创建表,但不能阻止开发人员使用 SSMS 设计和更改表。
Thanks.
首先,我将使用角色而不是直接向用户授予访问权限。您可能已经这样做了,但我想我会提到它。
好的,这里的问题是向架构授予 ALTER 权限意味着被授权者可以对架构中的所有对象类型进行 ALTER 访问。不幸的是,据我所知,没有办法向特定对象类型授予权限,所以要么全部要么全无。相反,您不能向所有对象授予 ALTER,然后拒绝对特定对象类型的 ALTER。
我发现执行此操作的唯一方法是向架构授予 ALTER 权限,然后使用 DDL 触发器来控制角色可以执行的操作。
这是示例的更新版本,演示了原理:
--** Create a Developer Role
CREATE ROLE [Developer] AUTHORIZATION db_securityadmin;
GO
--** Grant view and execute on all SPs to Devloper
--GRANT VIEW DEFINITION ON SCHEMA::dbo TO [Developer];
GRANT CREATE PROCEDURE TO [Developer];
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER, EXECUTE, VIEW DEFINITION ON SCHEMA::dbo TO [Developer]
--** Create user and login for testdev and add to the Developer role
CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj987kj'
CREATE USER testdev
EXEC sp_addrolemember @rolename = 'Developer', @membername = 'testdev';
GO
--** Create DDL trigger to deny drop and alter to the Developer role
CREATE TRIGGER tr_db_DenyDropAlterTable_Dev
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
BEGIN
IF IS_MEMBER('Developer') = 1
BEGIN
PRINT 'You are not authorized to alter or drop a table.';
ROLLBACK TRAN;
END;
END;
GO
--** Testing
CREATE TABLE mysig (a int NOT NULL) ;
EXECUTE AS USER = 'testdev';
GO
CREATE PROCEDURE slaskis AS PRINT 12;
GO
CREATE TABLE hoppsan(a int NOT NULL); -- FAILS!
GO
INSERT mysig (a) VALUES(123);
GO
ALTER TABLE mysig ADD test INT; --** This will fail too
GO
REVERT;
GO
DROP PROCEDURE slaskis ;
DROP TABLE mysig ;
DROP USER testdev;
DROP LOGIN testdev;
DROP ROLE [Developer];
DROP TRIGGER tr_db_DenyDropAlterTable_Dev on DATABASE;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)