2010-06-28 39 views
5

Tôi có một yêu cầu trong SQL Server 2008 trong cơ sở dữ liệu phát triểnTạo Thủ tục Permission CHỈ

  1. Chỉ DBA (là chủ sở hữu cơ sở dữ liệu) có thể tạo, thay đổi bảng. Nhà phát triển không được tạo hoặc thay đổi bảng.
  2. Nhà phát triển có thể tạo/thay đổi Thủ tục được lưu trữ/Người dùng xác định chức năng trong lược đồ dbo và có thể thực thi SP/UDF.
  3. phát triển nên có SELECT, INSERT, DELETE, UPDATE trên bảng ( bảng trong schema dbo

Làm thế nào để đạt được điều này sử dụng lệnh GRANT


Tìm thấy một giải pháp mẫu từ Google, nhưng vẫn có vấn đề

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 

Cú pháp trên có thể chặn nhà phát triển tạo bảng nhưng nhà phát triển khối không thể sử dụng SSMS d esign và thay đổi bảng.

Cảm ơn.

+0

trước hết bạn có các nhóm riêng biệt cho dba và nhà phát triển không? – hgulyan

+0

Nếu bạn đăng mã hoặc XML, ** vui lòng ** làm nổi bật các dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mã" (101 010) trên thanh công cụ của trình chỉnh sửa để định dạng và cú pháp tô sáng nó! –

+0

hgulyan: có, tôi đã có nhóm người dùng khác nhau cho dba & developers – mengchew0113

Trả lời

7

Trước hết, tôi sẽ sử dụng Vai trò thay vì cấp quyền truy cập trực tiếp cho người dùng. Bạn có thể đã làm điều này, nhưng tôi nghĩ tôi sẽ đề cập đến nó.

Được rồi, vấn đề ở đây là cấp ALTER cho giản đồ có nghĩa là người được cấp có quyền truy cập ALTER vào tất cả các loại đối tượng trong lược đồ. Thật không may, theo như tôi biết, không có cách nào để cấp quyền cho các loại đối tượng cụ thể vì vậy nó là tất cả hoặc không có gì. Ngược lại, bạn không thể cấp ALTER cho tất cả các đối tượng và sau đó từ chối ALTER đối với các loại đối tượng cụ thể.

Cách duy nhất tôi đã tìm thấy để làm điều này là cấp ALTER cho giản đồ và sau đó sử dụng Trình kích hoạt DDL để kiểm soát vai trò có thể thực hiện.

đây có một phiên bản cập nhật của các ví dụ của bạn thể hiện theo nguyên tắc:

--** 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

Cảm ơn các giải pháp – mengchew0113

+0

Chỉ cần phát hiện ra rằng người dùng có thể đổi tên tên bảng. chúng tôi có thể chặn hoặc từ chối người dùng bằng sp_rename không? – mengchew0113

+0

Ah vâng, sp_rename. Vâng, nếu bạn đang chạy SQL Server 2005, tôi không chắc chắn có nhiều bạn có thể làm. Tuy nhiên trong SQL Server 2008 họ đã thêm sự kiện RENAME DDL, vì vậy bạn có thể thay đổi Trình kích hoạt DDL của bạn để nắm bắt nó. Vì vậy, kích hoạt DDL trở thành: CREATE TRIGGER tr_db_DenyDropAlterTable_Dev ON DATABASE FOR DROP_TABLE, ALTER_TABLE, RENAME AS BEGIN .... – JonPayne

-1

Các mã sau đây sẽ tạo cho người sử dụng và vai trò trong sql máy chủ 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'; 

Hope này sẽ rất hữu ích. ...

+0

Đây không phải là câu trả lời.Câu hỏi được chỉ định "Nhà phát triển không được tạo hoặc thay đổi bảng" và người dùng trong ví dụ của bạn cũng có thể làm. – Thronk

Các vấn đề liên quan