调用具有表值参数作为参数之一的存储过程时,我收到以下错误
EXECUTE对象'ValidationErrors' 的权限被拒绝
ValidationErrors是使用以下语句创建的TVP:
CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
[ErrorMessage] [varchar](255) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
执行存储过程的用户对存储过程具有执行权限.但是,我仍然得到上述错误.有任何想法吗?
我有一个具有应用程序角色的数据库.角色成员都属于Active Directory中的组.我没有赋予角色权限以从表中选择,而是赋予角色对其需要调用的所有存储过程的执行权限.
这工作正常,除了我的一个存储过程,它正在构建一些动态SQL并调用sp_executesql.
动态sql看起来像这样:
SET @SQL = N'
SELECT *
FROM dbo.uvView1
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'
EXEC sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)
此角色的用户无法调用存储过程.它给出了以下错误,我想这是一种预期:
对象'uvView1',数据库'Foobar',架构'dbo'上的SELECT权限被拒绝.
有没有办法让我的用户成功执行此proc而不赋予动态SQL中所有视图的角色权限?
我有一个包含ID的List,我想使用Dapper将其插入到临时表中,以避免对"IN"子句中的参数进行SQL限制.
所以目前我的代码看起来像这样:
public IList<int> LoadAnimalTypeIdsFromAnimalIds(IList<int> animalIds)
{
using (var db = new SqlConnection(this.connectionString))
{
return db.Query<int>(
@"SELECT a.animalID
FROM
dbo.animalTypes [at]
INNER JOIN animals [a] on a.animalTypeId = at.animalTypeId
INNER JOIN edibleAnimals e on e.animalID = a.animalID
WHERE
at.animalId in @animalIds", new { animalIds }).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我需要解决的问题是,当animalIds列表中有超过2100个ID时,我得到一个SQL错误"传入的请求有太多参数.服务器最多支持2100个参数".
所以现在我想创建一个填充了传递给方法的animalIds的临时表.然后我可以加入临时表上的动物表,避免使用巨大的"IN"子句.
我尝试了各种语法组合,但没有得到任何结论.这就是我现在所处的位置:
public IList<int> LoadAnimalTypeIdsFromAnimalIds(IList<int> animalIds)
{
using (var db = new SqlConnection(this.connectionString))
{
db.Execute(@"SELECT INTO #tempAnmialIds @animalIds");
return db.Query<int>(
@"SELECT a.animalID
FROM
dbo.animalTypes [at]
INNER JOIN animals [a] on a.animalTypeId = …Run Code Online (Sandbox Code Playgroud)