Từ tài liệu :
- Mặc dù bất kỳ người dùng nào có quyền truy cập vào cơ sở dữ liệu đều có thể tạo sơ đồ, nhưng khi sơ đồ đã được tạo, người dùng duy nhất có thể thấy nó là người tạo sơ đồ và bất kỳ thành viên nào của vai trò db_owner.
- Quyền sở hữu các sơ đồ chỉ có thể được chuyển cho các thành viên của vai trò db_owner. Điều này chỉ có thể nếu chủ sở hữu trước của sơ đồ đã bị xóa khỏi cơ sở dữ liệu.
- Nếu chủ sở hữu của sơ đồ đã bị xóa khỏi cơ sở dữ liệu, sơ đồ sẽ vẫn còn trong cơ sở dữ liệu cho đến khi một thành viên của vai trò db_owner cố gắng mở nó. Tại thời điểm đó, thành viên db_owner có thể chọn tiếp quản quyền sở hữu sơ đồ.
Vì vậy, có vẻ như bạn sẽ không thể làm điều đó với các vai trò thấp hơn như db_datareader
.
Đằng sau hậu trường, đây là những gì Management Studio đang kêu gọi để điều khiển danh sách:
CREATE PROCEDURE dbo.sp_helpdiagrams
(
@diagramname sysname = NULL,
@owner_id int = NULL
)
WITH EXECUTE AS N'dbo'
AS
BEGIN
DECLARE @user sysname
DECLARE @dboLogin bit
EXECUTE AS CALLER;
SET @user = USER_NAME();
SET @dboLogin = CONVERT(bit,IS_MEMBER('db_owner'));
REVERT;
SELECT
[Database] = DB_NAME(),
[Name] = name,
[ID] = diagram_id,
[Owner] = USER_NAME(principal_id),
[OwnerID] = principal_id
FROM
sysdiagrams
WHERE
(@dboLogin = 1 OR USER_NAME(principal_id) = @user) AND
(@diagramname IS NULL OR name = @diagramname) AND
(@owner_id IS NULL OR principal_id = @owner_id)
ORDER BY
4, 5, 1
END
Vì vậy, bạn có thể thấy điều này phù hợp với các tài liệu.
Bây giờ một vài ý tưởng giải pháp:
- Trong một cò Logon, cập nhật
principal_id
của tất cả các sơ đồ là đăng nhập hiện tại. Điều này có nghĩa là họ sẽ có quyền truy cập vào tất cả các sơ đồ cho đến khi người tiếp theo đăng nhập. Không tối ưu.
- Sử dụng một kích hoạt trên
sysdiagrams
chính bảng (nó không thực sự là một bảng hệ thống) và bất cứ khi nào một sơ đồ được tạo hoặc cập nhật, hãy thêm / cập nhật một bản sao cho mỗi hiệu trưởng (có thêm tên người dùng của chúng). Không tối ưu, và bạn có thể yêu cầu mọi người ghi đè lên sơ đồ của nhau suốt cả ngày.
Đây là ý tưởng của cách giải quyết thứ hai - tất cả những gì bạn thực sự phải duy trì ở đây là danh sách các nguyên tắc cơ sở dữ liệu mà bạn muốn có thể truy cập vào sơ đồ (bạn cũng sẽ muốn có một cái gì đó để xóa sơ đồ đã bị xóa và cũng có một số bảo trì định kỳ xóa sơ đồ cho các hiệu trưởng đã bị xóa):
CREATE TRIGGER dbo.sysdiagrams_distribute
ON dbo.sysdiagrams
WITH EXECUTE AS N'dbo'
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @p TABLE(principal_id INT, name SYSNAME);
INSERT @p SELECT principal_id, name
FROM sys.database_principals
-- change this list:
WHERE name IN (N'test_blat_user', N'test_blat_user2', N'dbo');
UPDATE d
SET [version] = i.version, definition = i.definition
FROM inserted AS i
CROSS JOIN @p AS p
INNER JOIN dbo.sysdiagrams AS d
ON d.name = i.name
AND d.principal_id = p.principal_id;
INSERT dbo.sysdiagrams(name, principal_id, version, definition)
SELECT i.name, p.principal_id, i.version, i.definition
FROM inserted AS i
CROSS JOIN @p AS p
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.sysdiagrams WHERE name = i.name
AND principal_id = p.principal_id
);
END
GO
Sau khi tạo một vài sơ đồ, đây là phiên bản rút gọn của Object Explorer cho những người dùng này:
Bây giờ, dbo
sẽ thu thập một loạt các bản đồ, có thể không cần thiết, nhưng bạn có thể muốn chúng là "bản gốc" trong hầu hết các trường hợp.