Sql server 无法使用默认会话\表中用户约束(改为切换到用户\名称)

Sql server 无法使用默认会话\表中用户约束(改为切换到用户\名称),sql-server,sql-server-2014,Sql Server,Sql Server 2014,我定义了一个默认值为SESSION\u USER的约束,例如: CREATE TABLE [test] (col1 varchar(50)) GO ALTER TABLE [test] ADD CONSTRAINT [x] DEFAULT SESSION_USER FOR [col1] GO ALTER TABLE [dbo].[test] ADD CONSTRAINT [x] DEFAULT (user_name()) FOR [col1] 这似乎运行正常-命令已成功完成。 但是

我定义了一个默认值为
SESSION\u USER
的约束,例如:

CREATE TABLE [test] (col1 varchar(50))
GO
ALTER TABLE [test]  ADD  CONSTRAINT [x]  DEFAULT SESSION_USER FOR [col1]
GO
ALTER TABLE [dbo].[test] ADD  CONSTRAINT [x]  DEFAULT (user_name()) FOR [col1]
这似乎运行正常-
命令已成功完成。

但是-实际定义已修改为使用
user\u name()
函数,例如:

CREATE TABLE [test] (col1 varchar(50))
GO
ALTER TABLE [test]  ADD  CONSTRAINT [x]  DEFAULT SESSION_USER FOR [col1]
GO
ALTER TABLE [dbo].[test] ADD  CONSTRAINT [x]  DEFAULT (user_name()) FOR [col1]

为什么会这样

因为
SESSION\u USER
USER\u NAME()
的同义词:

连接到SQL Server实例时,请使用以下命令 要获取用户名或用户ID,请执行以下操作:

  • ISO
    当前用户
    会话用户
    可用于获取与当前连接关联的数据库用户名。在里面 Transact-SQL,这些函数作为
    用户名()
    。(
    USER\u NAME
    未指定
    database\u USER\u ID
    Transact-SQL函数
    USER
    也作为
    用户名()的同义词
(来源:)

约束在编译时被简化为常规形式,而不是像存储过程那样存储。您会注意到还添加了额外的括号。虽然文字定义没有保留,但语义是保留的