Good morning, Ray.
Wow, this one pulled on my memory strings a bit, going back to 2014, but I like a challenge.
The error you are getting is because of the WHERE clause in the TRIGGER (WHERE ACTIVITY.USERID = LastLogin.NAME)). In order to get the results you're looking for (I think), you'd also need to account for the Company. If you want to keep your current LastLogin data intact, you'd need to back up the table before proceeding, but here is what I threw together this morning to address the issue you're having. It's kind of a hack, so (again) use it at your own risk.
The specific modifications:
1) Drop and re-create (or modify) the LastLogin table to include CompanyName
2) Alter the UPDATE clause in the UpdateLastLogin trigger to include the CompanyName criteria and data
3) Alter the View to include the CompanyName field
What to expect:
Now the LastLogin table will be updated to reflect the Last Login Per Company.
I'm sure there is a cleaner way of doing the update with a HAVING statement, but this seems to work in my environment.
-----------------------------------------------------------------------------------------
USE DYNAMICS
GO
CREATE TABLE LastLogin (UserName VARCHAR(50), CompanyName VARCHAR(65), LastLogin DATETIME)
-----------------------------------------------------------------------------------------
USE DYNAMICS
GO
CREATE TRIGGER UpdateLastLogin ON ACTIVITY
FOR UPDATE, INSERT AS
INSERT INTO LastLogin (UserName)
SELECT q1.NAME
FROM (SELECT sp.NAME
FROM sys.server_principals sp
WHERE sp.[type] IN ('S', 'U', 'G')
AND sp.type_desc = 'SQL_LOGIN')q1
WHERE q1.NAME NOT IN (SELECT UserName FROM LastLogin)
UPDATE LastLogin
SET LastLogin.CompanyName = ACTIVITY.CMPNYNAM
, LastLogin.LastLogin = CONVERT(VARCHAR(10),ACTIVITY.LOGINDAT,111)+' '+CONVERT(VARCHAR(5),ACTIVITY.LOGINTIM,108)
FROM LastLogin
INNER JOIN ACTIVITY ON LastLogin.UserName = ACTIVITY.USERID
WHERE CONVERT(VARCHAR(10),ACTIVITY.LOGINDAT,111)+' '+CONVERT(VARCHAR(5),ACTIVITY.LOGINTIM,108) = (SELECT MAX(CONVERT(VARCHAR(10),LOGINDAT,111)+' '+CONVERT(VARCHAR(5),LOGINTIM,108))from activity)
-----------------------------------------------------------------------------------------
USE DYNAMICS
GO
CREATE VIEW UserLoginAudit AS
SELECT
sp.name NAME
, sp.type_desc LoginType
, CASE WHEN sp.is_disabled = 1 THEN 'YES' ELSE 'NO' END AS IsDisabled
, sp.create_date CreatedOn
, sp.modify_date LastChanged
, ll.LastLogin
, ll.CompanyName
, CASE WHEN sl.is_policy_checked = 1 THEN 'YES' ELSE 'NO' END AS PolicyChecked
, CASE WHEN sl.is_expiration_checked = 1 THEN 'YES' ELSE 'NO' END AS ExpireChecked
, CASE WHEN sp.modify_date < GETDATE()-90 AND sp.is_disabled = 0 THEN 'YES' ELSE '' END AS InViolation
FROM sys.server_principals sp
LEFT OUTER JOIN
sys.sql_logins sl ON sp.SID = sl.SID
LEFT OUTER JOIN LastLogin ll ON ll.UserName = sp.name
WHERE sp.[type] IN ('S', 'U', 'G')
AND sp.type_desc = 'SQL_LOGIN'
-----------------------------------------------------------------------------------------
-- Your final query to use the view you created
SELECT * FROM DYNAMICS..UserLoginAudit
ORDER BY NAME
-----------------------------------------------------------------------------------------