Azure SQL仅AD认证下获取登录用户名及ADF MSI默认约束问题求助
解决Azure SQL AD认证下的用户记录问题
为什么ADF用MSI连接时拿不到主体名?
当ADF通过托管服务标识(MSI)连接Azure SQL时,system_user返回的是MSI的**安全标识符(SID)**而非友好名称——这是SQL对服务主体的默认行为。但个人AD账号登录时,system_user会返回你的邮箱(UPN),所以两种场景结果不一致。
怎么获取正确的登录用户名称?
别用system_user,换成以下两种方法:
直接调用SUSER_SNAME()函数
这个函数能把SID转换为对应的AD主体名称,MSI场景下会返回你的数据工厂名称,个人用户场景返回邮箱:
SELECT SUSER_SNAME() AS CurrentUser;
查询系统视图获取详细主体信息
如果需要更多主体属性,可以查询sys.database_principals视图:
SELECT name AS PrincipalName, type_desc AS PrincipalType FROM sys.database_principals WHERE sid = SUSER_SID();
修改默认约束,让CreatedByUser自动记录正确用户
把原来的默认值从system_user改成SUSER_SNAME()即可,步骤如下:
- 先查询原约束的名称:
SELECT name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('你的表名') AND parent_column_id = COLUMNPROPERTY(OBJECT_ID('你的表名'), 'CreatedByUser', 'ColumnId');
- 删除旧约束(将下面的约束名替换为你查到的名称):
ALTER TABLE 你的表名 DROP CONSTRAINT DF_你的表名_CreatedByUser;
- 添加新的默认约束:
ALTER TABLE 你的表名 ADD CONSTRAINT DF_你的表名_CreatedByUser DEFAULT SUSER_SNAME() FOR CreatedByUser;
验证效果
修改完成后,ADF通过MSI执行DML操作时,CreatedByUser列会自动填入数据工厂的名称;个人用SSMS登录操作时,依然会记录你的邮箱地址。
内容的提问来源于stack exchange,提问作者azuresnowflake1
相关产品推荐
相关产品推荐

