You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中无法将用户定义表类型作为存储过程参数的问题排查

SQL Server创建带用户定义表类型参数的存储过程权限问题

问题场景

我在SQL Server数据库开发中,尝试创建带用户定义表类型参数的存储过程,代码如下:

create procedure db.insert_data
    @variable db.user_defined_type readonly
as
begin
    -- code
end;

执行时触发错误:

Msg 15151, Level 16, State 1, Procedure insert_data, Line 2
Cannot find the type 'user_defined_type', because it does not exist or you do not have permission.

但以下两类操作均可正常执行:

  • 创建不含用户定义表类型参数的存储过程并调用:
create procedure db.insert_data
    @variable int
as
begin
    -- code
end;
go

exec db.insert_data '1'
  • 使用用户定义表类型声明变量并执行插入、查询操作:
declare @variable db.user_defined_type

insert into @variable (col1, col2)
values (1, 2)

select * from @variable

我已加入拥有数据库几乎所有操作权限的角色组,想确认:

  1. 这是否属于权限问题?
  2. 如果是权限问题,需要哪种特定权限?
  3. 如何查询需要申请的权限?

附上完整创建脚本用于排查:

create table db.test_table(
    col1 nvarchar(3),
    col2 nvarchar(10),
    col3 nvarchar(35),
    col4 nvarchar(35),
    primary key (col1, col2)
);

GO

create type db.test_type as table(
    col1 nvarchar(3),
    col2 nvarchar(10),
    col3 nvarchar(35),
    col4 nvarchar(35),
    primary key (col1, col2)
);

GO

create procedure db.test_insert
@test_var db.test_type readonly
as
begin
--code
select null
end;

问题分析与解决

1. 是否为权限问题?

是的,该错误属于权限问题。虽然你能直接使用用户定义表类型进行变量声明、数据操作,但创建存储过程时,SQL Server要求调用者必须持有该类型的**REFERENCES权限**,否则会抛出“找不到类型”的错误。

2. 需要的特定权限

你需要对目标用户定义表类型拥有 REFERENCES 权限。这是SQL Server针对用户定义对象(包括表类型)的特殊权限要求,用于控制谁可以在其他对象(如存储过程)中引用该类型。

3. 权限查询与授权方法

查询当前账号对目标类型的权限

执行以下SQL,替换db和test_type为你的实际库名和类型名:

USE db;
SELECT 
    dp.permission_name,
    dp.state_desc,
    OBJECT_NAME(dp.major_id) AS type_name
FROM sys.database_permissions dp
JOIN sys.database_principals dpri ON dp.grantee_principal_id = dpri.principal_id
WHERE 
    dp.class = 6 -- 6代表用户定义类型
    AND OBJECT_NAME(dp.major_id) = 'test_type'
    AND dpri.name = USER_NAME();

如果结果中没有REFERENCES权限,说明你确实缺少该权限。

申请权限的语句

请数据库管理员或拥有该类型权限的用户执行以下授权语句,替换db、test_type和你的账号名为实际信息:

USE db;
GRANT REFERENCES ON TYPE::db.test_type TO [你的账号名];

验证

授权完成后,重新执行创建存储过程的脚本即可正常完成。

内容的提问来源于stack exchange,提问作者DimPap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:55:57