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
我已加入拥有数据库几乎所有操作权限的角色组,想确认:
- 这是否属于权限问题?
- 如果是权限问题,需要哪种特定权限?
- 如何查询需要申请的权限?
附上完整创建脚本用于排查:
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
相关产品推荐
相关产品推荐

