在每次DAO测试之前,我清理我的数据库,并且需要重置某些表的标识值。我创建了以下存储过程:如何启用非系统管理员帐户来执行“DBCC CHECKIDENT”?
CREATE PROCEDURE SET_IDENTITY
@pTableName varchar(120),
@pSeedValue int
AS
BEGIN
DBCC CHECKIDENT(@pTableName, RESEED, @pSeedValue);
END
我的问题是我需要用“普通”用户调用此存储过程。按顺序工作,该用户不能成为:sysadmin,db_owner,db_ddladmin的成员。
我已经试过:
一)CREATE PROCEDURE WITH EXECUTE AS OWNER
B)EXECUTE AS USER = 'sa' before call DBCC CHECKIDENT
但在这两种情况下,我回来了:
服务器主体sa
无法访问在当前安全上下文下的数据库my_db_name
。
我使用微软的SQL Server Express(64位)11.0.2100.60
谢谢你在前进,
阿贝尔
如果您的环境允许,请尝试使用'ALTER AUTHORIZATION ON DATABASE :: [mydb] TO [sa]'将数据库所有者设置为SQL Server可以验证的内容(确保您的数据库没有组帐户首先由设计师设计一个所有者!)然后'EXECUTE AS OWNER'应该可以工作。对于更强大的解决方案,您可以使用加密签名为存储过程提供必要的许可,但[涉及更多](http://sommarskog.se/grantperm.html#Certificates)。 –
另一种可能的解决方案是,如果“clean”意味着“清除整个表”,则使用'TRUNCATE TABLE',作为副作用也会重置身份并且只需要表中的'ALTER'权限。还要考虑使用[数据库项目](https://msdn.microsoft.com/library/hh272677)来创建一个干净的空数据库,您可以在每次测试运行之前部署(或者每次测试,甚至是,但这可能太慢)。另一种选择是恢复到[快照](https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/database-snapshots-sql-server)或分离/附加空的数据库。 –
规范声明您不能在表上使用TRUNCATE TABLE,而是由FOREIGN KEY约束引用。 –