2010-06-28 66 views
5

我在开发数据库创建过程准许只

  1. 只有DBA的(谁是数据库所有者)可以创建,修改表中的SQL Server 2008的要求。 开发人员不应该创建或更改表格。
  2. 开发人员可以在dbo模式下创建/更改存储过程/用户定义函数 ,并且可以执行SP/UDF。
  3. 开发人员应该有SELECT,INSERT,DELETE,在表上UPDATE(在dbo架构 表

如何实现这一点使用GRANT语句


发现从谷歌的样品溶液,但仍有问题

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 d设计并修改表格。

谢谢。

+0

首先,你们是否为dba和开发者分离了组? – hgulyan 2010-06-28 09:30:42

+0

如果您发布代码或XML,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010),以更好地格式化和语法突出显示它! – 2010-06-28 09:58:33

+0

hgulyan:是的,我的dba和开发人员拥有不同的用户组 – mengchew0113 2010-06-28 10:36:47

回答

7

首先,我会使用角色,而不是直接授予用户访问权限。你可能已经这样做了,但我想我会提到它。

好的,这里的问题是授予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; 
+0

感谢您的解决方案 – mengchew0113 2010-06-29 01:32:24

+0

刚刚发现用户可以重命名表名。 我们可以阻止或拒绝使用sp_rename的用户吗? – mengchew0113 2010-06-29 01:51:49

+0

啊是的,sp_rename。那么如果你正在运行SQL Server 2005,我不确定你能做什么。但是,在SQL Server 2008中,他们添加了RENAME DDL事件,因此您可以更改DDL触发器来捕获它。因此,DDL触发器变成:CREATE TRIGGER tr_db_DenyDropAlterTable_Dev ON DATABASE FOR DROP_TABLE,ALTER_TABLE,RENAME AS BEGIN .... – JonPayne 2010-06-29 06:51:00

-1

下面的代码将在SQL Server 2012中创建用户和角色:

USE PermissionDB; 
---Select Your database 
CREATE ROLE Employee; 
---Create role 
CREATE USER Employee1 Without Login; 
---Create User 

----Execute the Above query 
EXEC sp_addrolemember @rolename = 'Employee', @membername = 'Employee1'; 

希望这将是有益的。 ...

+0

这不是一个答案。指定的问题“开发人员不应该创建或更改表”,并且您的示例中的用户也可以执行任何操作。 – Thronk 2017-10-03 20:40:14