in src/TriggerBinding/SqlTriggerListener.cs [214:266]
private IReadOnlyList<string> GetUserTableColumns(SqlConnection connection, int userTableId, CancellationToken cancellationToken)
{
const int NameIndex = 0, TypeIndex = 1, IsAssemblyTypeIndex = 2;
string getUserTableColumnsQuery = $@"
SELECT
c.name,
t.name,
t.is_assembly_type
FROM sys.columns AS c
INNER JOIN sys.types AS t ON c.user_type_id = t.user_type_id
WHERE c.object_id = {userTableId};
";
using (var getUserTableColumnsCommand = new SqlCommand(getUserTableColumnsQuery, connection))
using (SqlDataReader reader = getUserTableColumnsCommand.ExecuteReaderWithLogging(this._logger))
{
var userTableColumns = new List<string>();
var userDefinedTypeColumns = new List<(string name, string type)>();
while (reader.Read())
{
cancellationToken.ThrowIfCancellationRequested();
string columnName = reader.GetString(NameIndex);
string columnType = reader.GetString(TypeIndex);
bool isAssemblyType = reader.GetBoolean(IsAssemblyTypeIndex);
userTableColumns.Add(columnName);
if (isAssemblyType)
{
userDefinedTypeColumns.Add((columnName, columnType));
}
}
if (userDefinedTypeColumns.Count > 0)
{
string columnNamesAndTypes = string.Join(", ", userDefinedTypeColumns.Select(col => $"'{col.name}' (type: {col.type})"));
throw new InvalidOperationException($"Found column(s) with unsupported type(s): {columnNamesAndTypes} in table: '{this._userTable.FullName}'.");
}
var conflictingColumnNames = userTableColumns.Intersect(ReservedColumnNames).ToList();
if (conflictingColumnNames.Count > 0)
{
string columnNames = string.Join(", ", conflictingColumnNames.Select(col => $"'{col}'"));
throw new InvalidOperationException($"Found reserved column name(s): {columnNames} in table: '{this._userTable.FullName}'." +
" Please rename them to be able to use trigger binding.");
}
this._logger.LogDebug($"GetUserTableColumns ColumnNames = {string.Join(", ", userTableColumns.Select(col => $"'{col}'"))}.");
return userTableColumns;
}
}