2010-02-02 9 views
8

Tôi muốn thêm người dùng có cùng vai trò trong nhiều cơ sở dữ liệu. Tuy nhiên vai trò có thể/không thể có mặt trong tất cả các cơ sở dữ liệu. Làm thế nào tôi có thể kiểm tra xem vai trò tồn tại trong cơ sở dữ liệu và liệu nó có thêm người dùng vào vai trò đó không?Kiểm tra xem vai trò có tồn tại trong DB không?

ví dụ: NẾU vai trò tồn tại BEGIN Thêm người dùng trong vai trò END

+0

Vui lòng tham khảo liên kết này. Có lẽ điều tương tự bạn đang tìm kiếm http://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server – madatanic

+0

Bản sao có thể có của [Cách thực hiện thế nào để tôi xác định nếu một vai trò cơ sở dữ liệu tồn tại trong SQL Server?] (https://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server) –

Trả lời

15

thử:

IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
    -- add user here 
    CREATE ROLE role AUTHORIZATION MyUser; 
END 
+0

Điều này không thành công nếu bạn có người dùng có cùng tên "vai trò" –

7
IF EXISTS 
(
    SELECT 1 
    FROM sys.database_principals 
    WHERE type_desc = 'DATABASE_ROLE' 
    AND name = 'name' 
) 
BEGIN 
    -- add user; 
END 
4

Tôi không thể bình luận được nêu ra, vì vậy tôi phải thêm này như là một câu trả lời.

Tôi thích càng cụ thể càng tốt, đó là lý do tại sao tôi thích bao gồm loại chính. Đây là lý do tại sao tôi bỏ phiếu cho câu trả lời của Aaron.

Sử dụng DATABASE_PRINCIPAL_ID có thể cho kết quả không mong muốn nếu có một loại chính khác có cùng tên với vai trò mà bạn muốn thêm. Điều này là do DATABASE_PRINCIPAL_ID trả về số ID của một số chính trong cơ sở dữ liệu hiện tại, không dành riêng cho một hiệu trưởng với một loại vai trò cơ sở dữ liệu.

Giả sử bạn có người dùng có cùng tên với vai trò cơ sở dữ liệu. Trạng thái của tập lệnh của Yada sẽ cho biết thành công, nhưng nó sẽ không thêm vai trò vì đã có một tên là chính. Tuy nhiên, kịch bản của Aaron sẽ quay trở lại các lỗi sau:

User, group, or role 'name' already exists in the current database.

Tôi thà bắt vấn đề này từ rất sớm (ví dụ khi kịch bản được điều hành) so với sau này (ví dụ khi ứng dụng của tôi đang được sử dụng).

Đây là những gì tôi thường muốn sử dụng:

IF NOT EXISTS(SELECT NULL FROM sys.database_principals WHERE [name] = 'role_name' AND [type]='R') 
BEGIN 
    -- add user; 
END 

Nếu tôi thực sự muốn để xử lý tình huống này và không hiển thị một lỗi, tôi có thể sử dụng một cái gì đó như thế này:

DECLARE @RoleName sysname, 
     @PrincipalType NVARCHAR(60); 

SET @RoleName = 'role_name'; 
SET @PrincipalType = (SELECT type_desc FROM sys.database_principals WHERE [name] = @RoleName); 

IF @PrincipalType IS NULL 
BEGIN 
    -- Add user; 
END 
ELSE IF @PrincipalType <> 'DATABASE_ROLE' 
BEGIN 
    --Deal with the issue as desired. Here we're printing out a warning. Important: The status will still indicate that the Query executed successfully when using PRINT to show warnings. 
    PRINT 'WARNING: The ' + @RoleName + ' database role was not created. A principal already exists in the database with a type of ' + @PrincipalType + '.'; 
END 
0

Để xác định cơ sở dữ liệu mà bạn sẽ tạo vai trò trong đó, bạn cần sử dụng

USE [DATABASE_NAME]; 

thì bạn có thể tiếp tục Ya da của câu trả lời và nó sẽ như thế này

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END