Tôi cần kịch bản một vai trò ứng dụng với mật khẩu băm, vì vậy tôi có thể sao chép nó từ cơ sở dữ liệu này sang cơ sở dữ liệu khác.
Xem xét mã ví dụ sau, sử dụng Vai trò ứng dụng để cung cấp quyền truy cập nâng cao cho người dùng không đáng tin cậy:
USE tempdb;
CREATE LOGIN LimitedLogin
WITH PASSWORD = 'Password1'
, CHECK_POLICY = OFF
, CHECK_EXPIRATION = OFF;
CREATE USER LimitedLogin
FOR LOGIN LimitedLogin
WITH DEFAULT_SCHEMA = dbo;
CREATE APPLICATION ROLE MyAppRole
WITH PASSWORD = 'Password2'
, DEFAULT_SCHEMA = dbo;
EXEC sp_addrolemember @rolename = 'db_datareader'
, @membername = 'MyAppRole';
CREATE TABLE dbo.Numbers
(
[Number] int CONSTRAINT PK_Numbers
PRIMARY KEY CLUSTERED
IDENTITY(1,1) NOT NULL
);
INSERT INTO dbo.Numbers
VALUES (1)
, (2);
GO
Khi chúng tôi đã tạo thiết lập thử nghiệm trong tempdb, chúng tôi có thể đăng nhập với tư cách [LimitedLogin]
người dùng và chạy như sau:
-- login as [LimitedLogin]
USE tempdb;
SELECT *
FROM dbo.Numbers;
Lỗi sau được trả về, như mong đợi:
Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object 'Numbers'
, database 'Test', schema 'dbo'.
Tuy nhiên, khi chúng tôi thực hiện sp_setapprole
với mật khẩu phù hợp, chúng tôi có thể thấy kết quả mong muốn từ dbo.Numbers
bảng:
DECLARE @cookie VARBINARY(8000);
EXEC sp_setapprole @rolename = 'MyAppRole'
, @password = 'Password2'
, @fCreateCookie = 1
, @cookie = @cookie OUT;
SELECT @cookie;
SELECT TOP(10) *
FROM dbo.Numbers;
EXEC sp_unsetapprole @cookie = @cookie;
Tôi muốn có thể tự động hóa việc tạo Vai trò ứng dụng bằng cách viết kịch bản từ cơ sở dữ liệu nguồn để được áp dụng cho cơ sở dữ liệu đích. Tôi có thể dễ dàng thực hiện phần lớn trong số đó bằng cách:
SELECT 'CREATE APPLICATION ROLE ' + QUOTENAME(dp.name) + '
WITH PASSWORD = ''xxxx''
, DEFAULT_SCHEMA = ' + QUOTENAME(dp.default_schema_name) + ';'
FROM sys.database_principals dp
WHERE dp.type_desc = 'APPLICATION_ROLE';
Tuy nhiên, tôi thực sự muốn có mật khẩu băm trong tập lệnh, đại loại như:
CREATE APPLICATION ROLE [MyAppRole]
WITH PASSWORD = 0x12345678 HASHED
, DEFAULT_SCHEMA = [dbo];
Điều này có thể không? Có lẽ phiên bản băm của mật khẩu vai trò ứng dụng được lưu trữ ở đâu đó trong cơ sở dữ liệu.
Sử dụng chức năng "script" -> "của SQL Server Management Studio, Vai trò ứng dụng được viết theo kịch bản với mật khẩu mới , như:
/****** Object: ApplicationRole [MyAppRole] Script Date: 9/22/2015 10:18:12 AM ******/
/* To avoid disclosure of passwords, the password is generated in script. */
declare @idx as int
declare @randomPwd as nvarchar(64)
declare @rnd as float
select @idx = 0
select @randomPwd = N''
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) +
(DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))
while @idx < 64
begin
select @randomPwd = @randomPwd + char((cast((@rnd * 83) as int) + 43))
select @idx = @idx + 1
select @rnd = rand()
end
declare @statement nvarchar(4000)
select @statement = N'CREATE APPLICATION ROLE [MyAppRole] WITH DEFAULT_SCHEMA = [dbo], ' + N'PASSWORD = N' + QUOTENAME(@randomPwd,'''')
EXEC dbo.sp_executesql @statement
GO
Rõ ràng, điều đó không hữu ích trong trường hợp của tôi, mặc dù nó cung cấp một phương pháp thú vị để tạo mật khẩu ngẫu nhiên.
Dựa trên các câu trả lời cho đến nay, tôi đã tạo đề xuất Kết nối để thêm hỗ trợ cho sản phẩm này: