【问题标题】:Create Procedure Permission ONLY仅创建过程权限
【发布时间】:2011-03-09 01:15:24
【问题描述】:

我在开发数据库中有 SQL Server 2008 的需求

  1. 只有 DBA(他们是数据库所有者)才能创建、更改表。 开发人员不应创建或更改表。
  2. 开发人员可以创建/更改存储过程/用户定义的函数 在 dbo 架构中,并且可以执行 SP/UDF。
  3. 开发人员应该对表有 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设计和修改表。

谢谢。

【问题讨论】:

  • 首先,您是否为 dba 和开发人员设置了单独的组?
  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
  • hgulyan:是的,我确实有不同的 dba 和开发人员用户组

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

  • 刚刚发现用户可以重命名表名。我们可以使用 sp_rename 阻止或拒绝用户吗?
  • 啊,是的,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....
  • 这不会阻止用户执行“TRUNCATE TABLE [table]”。这不能通过 DDL 触发器停止。
【解决方案2】:

以下代码将在 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';

希望这会有所帮助....

【讨论】:

  • 这不是答案。指定问题“开发人员不应创建或更改表”,您示例中的用户也可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2018-04-12
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多