Để mở rộng câu trả lời, các ý chính nói chung là tạo ra một vai trò cơ sở dữ liệu và gán quyền cho vai trò đó. Để làm điều đó, bạn cần một số SQL năng động ưa thích như:
Set @Routines = Cursor Fast_Forward For
Select ROUTINE_SCHEMA + '.' + ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE
From INFORMATION_SCHEMA.ROUTINES
Where ROUTINE_NAME NOT LIKE 'dt_%'
Or ROUTINE_TYPE = 'FUNCTION'
Open @Routines
Fetch Next From @Routines Into @Procname, @RoutineType, @DataType
While @@Fetch_Status = 0
Begin
Set @Msg = 'Procname: ' + @Procname + ', Type: ' + @RoutineType + ', DataType: ' + Coalesce(@DataType,'')
Raiserror(@Msg, 10, 1) WITH NOWAIT
If @RoutineType = 'FUNCTION' And @DataType = 'TABLE'
Set @SQL = 'GRANT SELECT ON OBJECT::' + @Procname + ' TO StoredProcedureDataReader'
Else
Set @SQL = 'GRANT EXECUTE ON OBJECT::' + @Procname + ' TO StoredProcedureDataReader'
exec(@SQL)
Fetch Next From @Routines Into @Procname, @RoutineType, @DataType
End
Close @Routines
Deallocate @Routines
Mã này sẽ cấp EXECUTE thủ tục lưu trữ và chức năng vô hướng và chọn chức năng người dùng định nghĩa mà trả về một kiểu TABLE.
Nhưng những gì @Peter nói về cơ bản là chính xác ... bạn sẽ cần phải cấp đặc quyền thực thi tên người dùng ... trang web này sẽ cung cấp cho bạn một cách nhanh chóng để thực hiện điều đó. – Aaron
Đó là một giải pháp đáng yêu! Bạn có phiếu bầu của tôi ... –