Ok, trên cơ sở nhận xét trên và theo sự nghi ngờ của tôi - có vẻ như bạn đang cố thực thi SQL động trong quy trình được lưu trữ của mình.
Điều bạn cần nhớ là khi bạn thực hiện việc này, nó không được thực thi trong ngữ cảnh của thủ tục được lưu trữ - nó sẽ được thực thi trong một phiên mới. Do đó, thực tế là câu lệnh đang được gọi trong một thủ tục được lưu trữ là một điểm cần thiết và bạn sẽ cần cấp quyền rõ ràng cho các đối tượng mà SQL động của bạn đang sử dụng.
Nếu bạn không muốn làm điều này, tôi sẽ cấu trúc lại thủ tục được lưu trữ của bạn để không sử dụng SQL động.
Liên kết dưới đây từ Microsoft sẽ giúp bạn giải quyết vấn đề của mình:
PRB: Bối cảnh bảo mật của các câu lệnh SQL động bên trong một thủ tục được lưu trữ (lưu trữ máy Wayback)
Hành vi này xảy ra vì một truy vấn thực thi động (sp_executesql hoặc EXECUTE) thực thi trong một bối cảnh riêng biệt từ thủ tục được lưu trữ chính; nó thực thi trong ngữ cảnh bảo mật của người dùng thực thi thủ tục được lưu trữ chứ không phải trong bối cảnh bảo mật của chủ sở hữu của thủ tục được lưu trữ.
Điều này cũng được thảo luận trong bài viết (hiện tại) của Microsoft Docs:
Viết SQL động an toàn trong SQL Server
Việc thực thi các câu lệnh SQL được tạo động trong mã thủ tục của bạn sẽ phá vỡ chuỗi quyền sở hữu, khiến SQL Server kiểm tra các quyền của người gọi đối với các đối tượng được SQL động truy cập.